如何在R中为同菌落匹配的DataFrame行添加COLONY列?
问题:为配对标签数据框添加菌落信息时出现长度不匹配警告
现有两个R语言DataFrame:X为标签配对数据,Y为标签对应菌落(COLONY)数据。已通过transform函数生成DataFrame Z,标记出X中配对标签是否属于同一菌落(SAME.COLONY)。尝试通过代码Z$COLONY<- ifelse(Z$SAME.COLONY == T && Z$label1 == Y$label, Y$COLONY, NA)为Z添加COLONY列时,出现警告:longer object length is not a multiple of shorter object length,因Z中标签存在重复,不知如何处理。
重现数据代码
X=data.frame(label1=c(1,1,1,2,2,2,3), label2=c(2,3,4,1,3,4,4)) Y=data.frame(label=c(1,2,3,4), COLONY=c(5,5,5,6)) Z <- transform(X, SAME.COLONY = Y$COLONY[match(X$label1, Y$label)] == Y$COLONY[match(X$label2, Y$label)] )
解决方案
问题根源
&&是标量逻辑运算符,只会比较两个向量的第一个元素,无法实现逐行判断;- 直接对比
Z$label1 == Y$label会因为Z(7行)和Y(4行)长度不匹配,R自动循环Y的元素导致错误匹配,无法准确关联每个标签对应的菌落。
正确代码
方法一:分步赋值
# 先给所有行匹配label1对应的菌落 Z$COLONY <- Y$COLONY[match(Z$label1, Y$label)] # 仅保留同一菌落的记录,其余设为NA Z$COLONY[!Z$SAME.COLONY] <- NA
方法二:用向量化的ifelse直接实现
Z$COLONY <- ifelse(Z$SAME.COLONY, Y$COLONY[match(Z$label1, Y$label)], NA)
执行后Z的结果:
label1 label2 SAME.COLONY COLONY 1 1 2 TRUE 5 2 1 3 TRUE 5 3 1 4 FALSE NA 4 2 1 TRUE 5 5 2 3 TRUE 5 6 2 4 FALSE NA 7 3 4 FALSE NA
内容的提问来源于stack exchange,提问作者Nat
相关产品推荐
相关产品推荐

