假设我有一个数据框 d1
,它看起来像这样:
site code trait
1 1 A 1.0
2 2 B 1.3
3 3 A NA
4 4 B 2.9
5 5 A NA
这是生成
d1
的 dput :structure(list(site = 1:5, code = structure(c(1L, 2L, 1L, 2L,
1L), .Label = c("A", "B"), class = "factor"), trait = c(1, 1.3,
NA, 2.9, NA)), .Names = c("site", "code", "trait"), row.names = c(NA,
-5L), class = "data.frame")
我有第二个数据框
d2
,如下所示: code trait
1 A 1.5
2 B 2.5
这是生成
d2
的 dput :structure(list(code = structure(1:2, .Label = c("A", "B"), class = "factor"),
trait = c(1.5, 2.5)), .Names = c("code", "trait"), row.names = c(NA,
-2L), class = "data.frame")
我想要一段代码,用
trait
中的特征值替换 d2
的 NA 值,该值与 code
中特定行的 d1
字符匹配。 d1
的最终输出如下所示: site code trait
1 1 A 1.0
2 2 B 1.3
3 3 A 1.5
4 4 B 2.9
5 5 A 1.5
我尝试过的事情:
d1$trait<- ifelse(is.na(d1$trait),d2$trait[d2$code == d1$code],d1$trait)
使用此代码时,我收到警告:
最佳答案
您的 ifelse
语法很接近,但问题在于:
d2$trait[d2$code == d1$code]
在这里,您试图从
d2$trait
查找与正确 code
值对应的 d1
值,但实际上您只是将 d2$code
的相应元素与 d1$code
进行比较。该操作可以改为使用 match
完成:d1$trait<- ifelse(is.na(d1$trait),d2$trait[match(d1$code, d2$code)], d1$trait)
d1
# site code trait
# 1 1 A 1.0
# 2 2 B 1.3
# 3 3 A 1.5
# 4 4 B 2.9
# 5 5 A 1.5
另一种方法是仅替换缺失值,再次使用
match
从 d2$trait
获取相关元素:d1$trait[is.na(d1$trait)] <- d2$trait[match(d1$code[is.na(d1$trait)], d2$code)]
d1
# site code trait
# 1 1 A 1.0
# 2 2 B 1.3
# 3 3 A 1.5
# 4 4 B 2.9
# 5 5 A 1.5
虽然
match
和 merge
在内部做非常相似的事情,但我发现 match
语法更容易使用,因为您不需要通过 merge
创建一个中间对象,然后从该中间对象中获取相关信息。关于r - 有条件地用第二个数据框中的值替换数据框中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34953925/