首页 > 解决方案 > R:根据其他两列的匹配替换列

问题描述

让我们假设有 2 列两个巨大的数据帧(不同长度),例如:

 df1       df2
A  1      C  X
A  1      D  X
B  4      C  X
A  1      F  X
B  4      A  X
B  4      B  X
C  7      B  X

每次第 1 列匹配时,X 应替换为 df1 第 2 列的数据。如果 df2 的第一列包含元素,但仍然不在 df1 的第一列(F,D),则应将 X 替换为 0。

因此有一个巨大的数据框,循环中的循环将没有用。

解决方案应如下所示:

 df1       df2
A  1      C  7
A  1      D  0
B  4      C  7
A  1      F  0
B  4      A  1
B  4      B  4
C  7      B  4

先感谢您

标签: rdataframedependenciesmultiple-columns

解决方案


由于'df1'中有重复的行,我们可以得到这些unique

df3 <- unique(df1)

然后,用于match获取 idnex

i1 <- match(df2$Col1, df3$Col1)

并基于索引,分配

df2$Col2 <- df3$Col2[i1]

如果没有匹配,则为NA,可以更改为 0

df2$Col2[is.na(df2$Col2)] <- 0
df2
#  Col1 Col2
#1    C    7
#2    D    0
#3    C    7
#4    F    0
#5    A    1
#6    B    4
#7    B    4

或者,这可以通过对“Col1”data.table进行joining 并将“Col2”(在从第二个数据中删除 Col2 之后)与“df3”中的 Col2 分配来完成

library(data.table)
setDT(df2)[, Col2 := NULL][df3, Col2 := Col2, on = .(Col1)]

数据

df1 <- structure(list(Col1 = c("A", "A", "B", "A", "B", "B", "C"), Col2 = c(1, 
1, 4, 1, 4, 4, 7)), class = "data.frame", row.names = c(NA, -7L
))

df2 <- structure(list(Col1 = c("C", "D", "C", "F", "A", "B", "B"), Col2 = c("X", 
"X", "X", "X", "X", "X", "X")), class = "data.frame", row.names = c(NA, 
-7L))

推荐阅读