r - 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
先感谢您
解决方案
由于'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
进行join
ing 并将“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))
推荐阅读
- python - Faiss Kmeans图像聚类中的错误
- json - 从 serde_json 中的无类型 JSON 中提取数据时如何处理错误?
- flutter - 如何使用带有 getX boolean observable 的条件渲染
- layout - Odoo.sh 终端无法识别正确的键盘布局
- flutter - 将加载微调器添加到启动画面
- bash - 根据列表和文件目录重命名文件列表
- flutter - 如何使用自定义小部件绘制一条线并在用户点击线颤动时更改角度
- python - 与将 timedelta 添加到 UTC 日期相比,Python astimezone 比预期结果晚 1 小时
- reactjs - 将状态从其他组件更新到主组件
- jupyter-notebook - 有没有办法在 jupyter markdown 中输入 $\newcommand$ 以正确导出到 LaTeX?