【问题标题】:Replace certain values of one dataframe with values in another dataframe if common row found如果找到公共行,则将一个数据帧的某些值替换为另一个数据帧中的值
【发布时间】:2017-01-10 21:58:11
【问题描述】:

我有一个数据框 A:

ID A B C
2000 2 3 4
2001 2 7 2
2002 1 8 5
2003 6 2 3

还有另一个数据框 B:

ID  B     
2001 0 
2003 0 

预期输出:

ID A B C
2000 2 3 4
2001 2 0 2
2002 1 8 5
2003 6 0 3

这是一个大型数据集,我想找到所有常见的 ID 并将特定列替换为来自另一个数据帧的值。

我该怎么做?

【问题讨论】:

  • @nrussell 如何合并它们,因为我只想“插入”其中一列? A 和 B 中的列不一样。
  • dfA[match(dfB$ID, dfA$ID),names(dfB)[-1]] <- dfB[-1] 适用于要替换的任意数量的列。
  • 在 ID 上左连接并使用 dfB 中满足连接约束的 B 值,否则使用 dfA 中的 B 值。

标签: r


【解决方案1】:

试试这个:

library(data.table)
dt1 = data.table(ID = c(2000,2001,2002,2003), A = c(2,2,1,6), B = c(3,7,8,2), C = c(4,2,5,3))
dt2 = data.table(ID = c(2001, 2003), B = c(0,0))
dt1 = merge(dt1,dt2,by = c("ID"),all.x = TRUE)

这给了我们

     ID A B.x C B.y
1: 2000 2   3 4  NA
2: 2001 2   7 2   0
3: 2002 1   8 5  NA
4: 2003 6   2 3   0

然后,我不确定您是否有错字并且真的想重置 B,但如果您确实想将 C 重置为 B.y 运行此

dt1$C = ifelse(!is.na(dt1$B.y),dt1$B,dt1$C)

这会给我们:

      ID A B.x C B.y
1: 2000 2   3 4  NA
2: 2001 2   7 0   0
3: 2002 1   8 5  NA
4: 2003 6   2 0   0

然后,只需删除 B.y 并将 B.x 改回 B

dt1[,B.y:= NULL]
colnames(dt1)[3] = "B"

     ID A B C
1: 2000 2 3 4
2: 2001 2 7 0
3: 2002 1 8 5
4: 2003 6 2 0

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2016-07-24
    • 1970-01-01
    • 2021-03-21
    • 2021-08-02
    • 1970-01-01
    • 2022-01-24
    • 2018-01-23
    • 1970-01-01
    相关资源
    最近更新 更多