请参阅下面的国家/地区简化数据集:
country <- c("CountryA", "CountryA", "CountryA", "CountryA",
"CountryB", "CountryB", "CountryB", "CountryB",
"CountryC", "CountryC", "CountryC", "CountryC")
year <- c(2001, 2002, 2003, 2004,
2001, 2002, 2003, 2004,
2001, 2002, 2003, 2004)
v1 <- c(2, 3, 5, 4, 3, 3, 1, 2, 1, 4, 3, 2)
df1 <- data.frame(country, year, v1)
df1
country year v1
CountryA 2001 2
CountryA 2002 3
CountryA 2003 5
CountryA 2004 4
CountryB 2001 3
CountryB 2002 3
CountryB 2003 1
CountryB 2004 2
CountryC 2001 1
CountryC 2002 4
CountryC 2003 3
CountryC 2004 2
我的问题是:
如何编写一个代码,用于创建上述数据集的基于事件的子集,如下所示:
cntry <- c("CountryA", "CountryB", "CountryC")
stYear <- c(2001, 2002, 2003)
endYear <- c(2003, 2004, 2003)
v1Max <- c(5, 3, 3)
v1Ave <- c(3.33, 2, 3)
df2 <- data.frame(cntry, year, v1)
df2
cntry stYear endYear v1Max v1Ave
CountryA 2001 2003 5 3.33
CountryB 2002 2004 3 2
CountryC 2003 2003 3 3
换句话说,我需要将每个事件分别编码为一个新的数据框。 (例如,上面df2中的第一行是 2001年至2003年CountryA中的事件。)在执行此操作时,我还需要在相应的时间范围内重新编码值。 (例如,df2中的v1Max是事件持续时间内v1在df1中的最大值。同样,df2中的v1Ave是平均值。)
如果您可以为我提供执行上述从df1到df2的转换的代码,我可以对其进行增强以解决我的问题。
谢谢!
答案 0 :(得分:0)
您的标题意味着某种数据清理或子集化,但您在此处的内容是聚合或摘要。要使用提供的数据执行此操作,dplyr
是一个很好的选择:
library(dplyr)
df2 <- group_by(df1, country) %>%
summarize(start = min(year), end = max(year), v1Max = max(v1), v1Avg = mean(v1))
# A tibble: 3 x 5
# country start end v1Max v1Avg
# <fctr> <dbl> <dbl> <dbl> <dbl>
#1 CountryA 2001 2004 5 3.50
#2 CountryB 2001 2004 3 2.25
#3 CountryC 2001 2004 4 2.50