嗨,我正在尝试使用merge函数编写更新分母表中的列的操作。桌子就是这样。
Table A
A B C D E
1 2 5 2 a
2 2 5 3 a
3 3 6 4 c
4 4 4 1 c
700rows
Table B
A B C D E
1 2 5 2 c
2 2 5 3 c
3 3 6 4 c
500rows
第一个表是我从数据库中获得的,具有固定数量的记录需要用作分母,因此总行数不变,第二个表是我也从另一个服务器中拉出的表表B的行数小于表A的行数(固定)。我只是想尽可能地更新表A中的表E列。我尝试了所有类型的连接,它们将在更新后更改行号,您是否有通过合并功能或任何其他方法解决的想法?
输出应为:
A B C D E
1 2 5 2 c
2 2 5 3 c
3 3 6 4 c
4 4 4 1 c
700 rows
表A的行号不会改变。但仅对于列E,如果表B中存在相同的记录,它就会被更新。
非常感谢您!
答案 0 :(得分:1)
在R中,我认为您可以执行left_join
来保持第一个数据集中的行不变,然后从B
数据集中(如果存在)或使用A
从coalesce
中选择值
library(dplyr)
left_join(A, B, by = c("A", "B", "C", "D")) %>%
mutate(E = coalesce(E.y, E.x)) %>%
select(-E.x, -E.y)
# A B C D E
#1 1 2 5 2 c
#2 2 2 5 3 c
#3 3 3 6 4 c
#4 4 4 4 1 c
数据
假设A
和B
是两个数据集。
A <- structure(list(A = 1:4, B = c(2L, 2L, 3L, 4L), C = c(5L, 5L,
6L, 4L), D = c(2L, 3L, 4L, 1L), E = structure(c(1L, 1L, 2L, 2L
), .Label = c("a", "c"), class = "factor")), class = "data.frame",
row.names = c(NA, -4L))
B <- structure(list(A = 1:3, B = c(2L, 2L, 3L), C = c(5L, 5L, 6L),
D = 2:4, E = structure(c(1L, 1L, 1L), .Label = "c", class = "factor")),
class = "data.frame", row.names = c(NA, -3L))
答案 1 :(得分:0)
我认为这不是最优雅的方法,但是这段代码应该可以在R上运行:
TableA = data.frame(A = c(1,2,3,4), B = c(2,2,3,4), C = c(5,5,6,4), D = c(2,3,4,1), E = c("a","a","c","c"))
TableB = data.frame(A = c(1,2,3,4), B = c(2,2,3,4), C = c(5,5,6,4), D = c(2,3,4,1), E = c("c","c","c","c") )
使用for
循环来测试TableA
的每一行与TableB
的每一行,并将E
的{{1}}列替换为TableA
的列E
,如果行相同(对于A,B,C,D列):
TableB
输出:
for(i in 1:nrow(TableB))
{
if(length(grep(FALSE,TableB[i,c(1:4)]==TableA[i,c(1:4)]))==0){TableA[i,"E"] = TableB[i,"E"]}
else{}
}
它回答了您的问题吗?