gpt4 book ai didi

r - 有条件地将数据框中的值替换为第二个数据框中的值

转载 作者:行者123 更新时间:2023-12-01 10:36:14 24 4
gpt4 key购买 nike

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

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的输入:

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 的 NA 值替换为 d2 中与 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)

使用此代码时,我收到警告:

Warning messages: 1: In is.na(e1) | is.na(e2) : longer object length is not a multiple of shorter object length 2: In ==.default(d2$code, d1$code) : longer object length is not a multiple of shorter object length

最佳答案

您的 ifelse 语法很接近,但有问题的是:

d2$trait[d2$code == d1$code]

在这里,您试图从 d1 中查找与正确的 code 值相对应的 d2$trait 值,但实际上您是只是比较 d2$coded1$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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com