如何解决如果某个观察出现不止一次,是否通过总结将数据重塑为面板?
我有关于四个不同村庄(A、B、C、D)的学校成立年份(year_est)的数据(df_input)。
df_input <- data.frame( school_id= c(1,2,3,4,5,6),village= c("A","B","C","D","D"),year_est = c(2002,2002,2004,2001,2004))
df_output <- data.frame(year= c(2001,2003,2004),village = c("A","A",school_est=c(0,1,2))
我正在尝试重塑 df_ouput 的格式,如果村里建立了学校,变量“school_est”的值为 1,否则保持为 0。
此外,如果在特定村庄建立了不止一所学校,那么变量 school_est 可以取大于 1 的值,例如,对于 df_output 中的 2004 年的村庄 B。
在我的数据集中,同年在同一个村庄建立不止一所学校的情况也很常见,就像2004年的D村一样。所以在df_output数据集中,school_est取值= 2 2004年从2003年的0开始。
有人可以帮我解决这个问题吗?
df_panel <- df_input %>%
merge(expand.grid(year=2001:2004,Village=.$Village),by="Village") %>%
mutate(across(year_est,~ as.numeric(replace_na(.x <= year,0))))
解决方法
花费的时间比预期的要长
library(tidyverse)
df_input <- data.frame( school_id= c(1,2,3,4,5,6),village= c("A","B","C","D","D"),year_est = c(2002,2002,2004,2001,2004))
df_input %>%
group_by(village,year_est) %>%
summarise(school_est = n(),.groups = 'drop') %>%
complete(nesting(village),year_est = seq(min(year_est),max(year_est),1),fill = list(school_est = 0)) %>%
group_by(village) %>%
mutate(school_est = cumsum(school_est)) %>%
ungroup()
#> # A tibble: 16 x 3
#> village year_est school_est
#> <chr> <dbl> <dbl>
#> 1 A 2001 0
#> 2 A 2002 1
#> 3 A 2003 1
#> 4 A 2004 1
#> 5 B 2001 0
#> 6 B 2002 1
#> 7 B 2003 1
#> 8 B 2004 2
#> 9 C 2001 1
#> 10 C 2002 1
#> 11 C 2003 1
#> 12 C 2004 1
#> 13 D 2001 0
#> 14 D 2002 0
#> 15 D 2003 0
#> 16 D 2004 2
由 reprex package (v2.0.0) 于 2021 年 6 月 28 日创建
,我们可以使用complete
library(dplyr)
library(tidyr)
df_input %>%
count(village,year = year_est,name = 'school_est') %>%
complete(village,year = min(year):max(year),fill = list(school_est = 0)) %>%
mutate(school_est = ave(school_est,village,FUN = cumsum))
-输出
# A tibble: 16 x 3
village year school_est
<chr> <dbl> <dbl>
1 A 2001 0
2 A 2002 1
3 A 2003 1
4 A 2004 1
5 B 2001 0
6 B 2002 1
7 B 2003 1
8 B 2004 2
9 C 2001 1
10 C 2002 1
11 C 2003 1
12 C 2004 1
13 D 2001 0
14 D 2002 0
15 D 2003 0
16 D 2004 2
或者使用 base R
out <- transform(as.data.frame(table(transform(df_input,year_est = factor(year_est,levels = min(year_est):max(year_est)))[-1])),Freq = ave(Freq,FUN = cumsum))
out[order(out$village),]
village year_est Freq
1 A 2001 0
5 A 2002 1
9 A 2003 1
13 A 2004 1
2 B 2001 0
6 B 2002 1
10 B 2003 1
14 B 2004 2
3 C 2001 1
7 C 2002 1
11 C 2003 1
15 C 2004 1
4 D 2001 0
8 D 2002 0
12 D 2003 0
16 D 2004 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。