使用另一个数据框的匹配值向数据框添加新列

26
我正在尝试使用table2的匹配val2值来填充table1。
table1$New_val2 = table2[table2$pid==table1$pid,]$val2

输入图像描述

但是我收到了警告

longer object length is not a multiple of shorter object length

这很公平,因为表的长度不同。

请指导我正确的操作方法。


2
如果需要,可以选择添加 all.x=TRUE 参数:merge(table1, table2, by="pid") - cory
嗨,Cory,如果表2中还有其他列,但我只想添加col2怎么办? - andy
3
合并(table1, table2[, c("pid", "col2")]), 通过"pid" 列进行合并。 - cory
3个回答

50

merge(table1, table2[, c("pid", "val2")], by="pid")

使用all.x=TRUE参数,可以保留在table2中没有匹配的所有pid在table1中的记录...

你走在了正确的道路上。这里介绍一种使用match的方法...

table1$val2 <- table2$val2[match(table1$pid, table2$pid)]


注:`merge()`和`match()`是用于处理数据框的R语言函数

如果列名不同但实际上它们在内容上是相同的,我是否只需在 by.x 和 by.y 中声明它们的名称?例如:table1 中的 pid 被称为 pid,但在 table2 中它有另一个名称,例如 pidx。 - Lukas Süsslin
1
是的,by.x和by.y用于两个表之间索引名称不同的情况。 - cory

8

我不确定你是否是指这个,但你可以使用以下方法:

newtable <- merge(table1,table2, by  = "pid") 

这将创建一个名为newtable的新表,具有3个列以及由id匹配的那些值,在本例中为"pid"。


4

我来晚了,但如果其他人有同样的问题:这正是dplyr的inner_merge所做的。

table1.df <- dplyr::inner_join(table1, table2, by=pid)

by-command(按照指定方式)指定使用哪一列来匹配行。

编辑:我曾经很难记住它是 [join] 而不是 [merge]。


我更喜欢使用dplyr::inner_join()而不是merge(),因为在这个过程中表格不会被打乱。 - Yollanda Beetroot
2
现在pid也需要用""括起来 - 即table1.df <- dplyr::inner_join(table1, table2, by = "pid") - André.B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接