假设我有一个数据框 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

另一种方法是仅替换缺失值,再次使用 matchd2$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

虽然 matchmerge 在内部做非常相似的事情,但我发现 match 语法更容易使用,因为您不需要通过 merge 创建一个中间对象,然后从该中间对象中获取相关信息。

关于r - 有条件地用第二个数据框中的值替换数据框中的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34953925/

10-16 22:21