R 将一个数据集重新编码到另一个数据集中

R 将一个数据集重新编码到另一个数据集中,r,recode,R,Recode,请参见以下简化数据集,该数据集以国家/年度为基础: country <- c("CountryA", "CountryA", "CountryA", "CountryA", "CountryB", "CountryB", "CountryB", "CountryB", "CountryC", "CountryC", "CountryC", "CountryC") year <- c(2001, 2002, 2003, 2004, 2001, 2002, 2003, 2004, 20

请参见以下简化数据集,该数据集以国家/年度为基础:

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

country您的标题意味着某种类型的数据清理或子集,但这里您要的是聚合或摘要。对于提供的数据,
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
库(dplyr)
df2%
汇总(开始=最小值(年),结束=最大值(年),v1Max=最大值(v1),v1Avg=平均值(v1))
#一个tibble:3x5
#国家/地区起始端v1Max v1Avg
#        
#1 CountryA 2001 2004 5 3.50
#2 CountryB 2001 2004 3 2.25
#3 CountryC 2001 2004 4 2.50

您想重新编码数据集还是将其子集?我编辑了问题文本。谢谢你提醒我。事实上,它是聚合的。重新编码是重新标记值,子集是在不重新编码或更改其形状的情况下获取数据的子集,聚合是通过使用聚合函数(如平均值、最大值等)对数据进行分组来汇总数据。是的,它确实是聚合的一种形式。谢谢。但是您的代码对所有行返回相同的开始年和结束年,这是因为您作为示例提供的数据集对每个“country”值都具有相同的开始年和结束年。例如,如果您删除了CountryA的2004条目,则摘要将只运行到2003年。我理解。但我想创建一个子集,如上面的df2所示。我不希望子集包含df1中的所有年份。似乎您希望在这里有非常具体的行为,每个国家提取不同的年份。要做到这一点,您需要在使用上述代码之前对数据进行子集划分,条件是
子集(df,(country='CountryA'&year>=2001&year<2004)|(country='CountryB'&year>=2002&year<2005)|(country='CountryC'&year==2003))
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