比较2个数据帧中ID的字符变量

时间:2018-11-23 04:20:16

标签: r

merge1 <- within(merge(df1, df2, by=c("ID"),all=F),
 AD <- A.x - A.y                                                  
 BD <- B.x - B.y                                                
 CD <- C.x - C.y
 DC <- ifelse(df1$D != df2$D | df1$D == "TOT" | df2$D == "TOT", 1, 0)
})[,c("ID","AD","BD","CD","DC")] 

我想比较两个数据集的ID统计信息。想象每个df代表一年的数据。除了我尝试使用ifelse语句添加“ DC”变量时,它的工作方式与我希望的完全相同。有关数据集的一些信息是它们的长度不相等,df1中存在的ID可能在df2中不存在,反之亦然。每个数据帧中的D变量由组织组成。但是,我希望新合并的df是ID是否更改组织的二进制文件。这就是为什么我有ifelse语句的原因,如果df1中的D与df2中的D不匹配,那么我希望它输出1。另外,如果来自任一或两个数据帧的D恰好被标记为TOT,那么我希望它输出1。如果df1 $ D = df2 $ D并且TOT未分配给ID,我只希望它输出0。 ifelse(语句可以这样使用还是我做错了吗?我对R有点陌生,所以我先感谢您的帮助。

编辑

这是产生的错误代码:

Error in `[<-.data.frame`(`*tmp*`, nl, value = list(TmC = c(1, 1, 0, 1,  : 
 replacement element 1 has 486 rows, need 576
In addition: Warning messages:
1: In if (all.x) all.x <- (nxx <- length(m$x.alone)) > 0L :
 the condition has length > 1 and only the first element will be used
2: In if (all.y) all.y <- (nyy <- length(m$y.alone)) > 0L :
 the condition has length > 1 and only the first element will be used  
3: In is.na(e1) | is.na(e2) :
 longer object length is not a multiple of shorter object length
4: In `!=.default`(nbasumadv1617$Tm, nbasumadv1516$Tm) :
 longer object length is not a multiple of shorter object length
5: In nbasumadv1617$Tm != nbasumadv1516$Tm | nbasumadv1617$Tm == "TOT" |  :
 longer object length is not a multiple of shorter object length

我在这里描述了变量名的简化版本。它按我的意愿工作,没有第四个“ DC”变量,该变量在我的实际代码中实际上被标记为TmC。我相信这段代码实际上不会产生任何效果,因为它向我展示的内容与我没有第四个变量创建的内容没有什么不同。前两个错误消息仍然没有第四个“ DC”变量出现,但是很好。最后3条错误消息和TmC替换元素不匹配错误是新的。

1 个答案:

答案 0 :(得分:0)

只需调整ifelse调用即可使用实际的合并列 D.x D.y ,而不使用其原始来源。合并时,所有列均等长,因为根据定义,数据帧是等长原子向量的列表。但是像您最初那样引用df1$Ddf2$D可能会涉及不同的长度,因此会导致错误。

merge1 <- within(merge(df1, df2, by=c("ID"), all=FALSE),
                 {
                   AD <- A.x - A.y                                                  
                   BD <- B.x - B.y                                                
                   CD <- C.x - C.y
                   DC <- ifelse(D.x != D.y | D.x == "TOT" | D.y == "TOT", 1, 0)
                 } 
          )[,c("ID","AD","BD","CD","DC")]