R:通过合并来自另一个数据集的值对变量进行部分重新编码

R:通过合并来自另一个数据集的值对变量进行部分重新编码,r,merge,recode,R,Merge,Recode,我甚至不知道该怎么问这个问题,所以请耐心听我说 我注意到我正在处理的数据集中有一个错误,ANES累积文件。在数据集中的某一年(2004年),一个变量(我将其重命名为“grewup”)的值被意外遗漏,因此该年的值仅为“NA”。其他年份的值都存在,因此数据集基本上如下所示: 我确实有另一个数据集,它只包含2004个数据集,并且缺少“grewup”的值。我想做的是使用第二个数据集中的值重新编码2004年的NAs。我该怎么做?同样,这些值在剩余年份的累积数据集中;我只想为2004年重新编码,而不考虑其他

我甚至不知道该怎么问这个问题,所以请耐心听我说

我注意到我正在处理的数据集中有一个错误,ANES累积文件。在数据集中的某一年(2004年),一个变量(我将其重命名为“grewup”)的值被意外遗漏,因此该年的值仅为“NA”。其他年份的值都存在,因此数据集基本上如下所示:

我确实有另一个数据集,它只包含2004个数据集,并且缺少“grewup”的值。我想做的是使用第二个数据集中的值重新编码2004年的NAs。我该怎么做?同样,这些值在剩余年份的累积数据集中;我只想为2004年重新编码,而不考虑其他值

谢谢

一些澄清和补充:

  • 我只想从第二个数据集中引入这一个变量,以避免使第一个数据集变得比现在更庞大和内存消耗(951列)。实际上还有很多其他的变量,它们或者我已经有了

  • 此外,虽然2004年的所有值都是NAs,但数据集中并非每个NA都是2004年的。在过去的几年里,有一些是合法的价值缺失


您应该能够按id和年份合并这些数据帧:

 merge(dat1,dat2,by=c("id", "year"),all.x=TRUE)  # and "outer join"
  id year grewup.x grewup.y
1  1 2002      127       NA
2  2 2002      310       NA
3  3 2004       NA      438
4  4 2004       NA      834
5  5 2008      332       NA
6  6 2008      614       NA
 datm <- merge(dat1,dat2,by=c("id", "year"),all.x=TRUE)

 # No "fill in the blanks
 datm[is.na(datm$grewup.x), "grewup.x"] <- datm[is.na(datm$grewup.x), "grewup.y"] 
 # Notice that the logical index is the same on both sides of the assignment

 datm[ ! names(datm) %in% 'grewup.y' ]  # drop the supplementary column

  id year grewup.x
1  1 2002      127
2  2 2002      310
3  3 2004      438
4  4 2004      834
5  5 2008      332
6  6 2008      614
merge(dat1,dat2,by=c(“id”,“year”),all.x=TRUE)#和“外部连接”
id年份grewup.x grewup.y
1 1 2002 127 NA
2 2002 310 NA
3 3 2004 NA 438
4 2004 NA 834
5 5 2008 332 NA
6 2008 614 NA

datm他们每年的观察次数是否相同?发布数据框架否,两个数据集每年的观察次数都不相同。在第一个数据集中,每年的病例从大约200例到2700多例不等。第二个数据集仅用于2004年。(如果你问他们在2004年是否有相同数量的观察结果,那么是的,他们有。)哦,那就简单多了,看看下面的答案为什么?如果数据的结构很简单,仅当ID完全相同且顺序相同时,
dat1[dat1$year%in%2004,]$grewup。我认为这是有道理的,但我有一个问题:这会把两个数据集中的每个变量合并在一起吗?我使用的数据示例是一个非常非常精简的版本。第一个数据集中实际上有951个变量(和49760个观测值),而第二个数据集中有1197个变量。这将创建更宽的数据框(951+1197-2)列。它需要使用lappy和一个设计用于处理成对列名的函数。寓意:您应该始终提供足够复杂的数据集。
 merge(dat1,dat2,by=c("id", "year"),all.x=TRUE)  # and "outer join"
  id year grewup.x grewup.y
1  1 2002      127       NA
2  2 2002      310       NA
3  3 2004       NA      438
4  4 2004       NA      834
5  5 2008      332       NA
6  6 2008      614       NA
 datm <- merge(dat1,dat2,by=c("id", "year"),all.x=TRUE)

 # No "fill in the blanks
 datm[is.na(datm$grewup.x), "grewup.x"] <- datm[is.na(datm$grewup.x), "grewup.y"] 
 # Notice that the logical index is the same on both sides of the assignment

 datm[ ! names(datm) %in% 'grewup.y' ]  # drop the supplementary column

  id year grewup.x
1  1 2002      127
2  2 2002      310
3  3 2004      438
4  4 2004      834
5  5 2008      332
6  6 2008      614