【问题标题】:How to add a column from one dataframe to a different dataframe based on an ID in R?如何根据 R 中的 ID 将一个数据帧中的列添加到另一个数据帧?
【发布时间】:2021-10-22 05:54:29
【问题描述】:

我有两个由字符串组成的不同数据框(数千行)。它们每个都有不同数量的条目。我正在尝试找到一个代码,允许我将 df2 中“特征”列的内容关联到 df1(参见下面的示例):

Df1:

ID Information
11AA info1
22BB info2
33CC info3
44DD info4
11AA info1
22BB info2

Df2:

ID Characteristic
11AA char1
22BB char2
33CC char3
44DD char4

预期的结果是:

Df3:

ID Information Characteristic
11AA info1 char1
22BB info2 char2
33CC info3 char3
44DD info4 char4
11AA info1 char1
22BB info2 char2

我尝试使用 inner_join(df1,df2, by="ID") 但生成的数据帧 (df3) 通常比原始数据帧 (df1) 包含更多行,我需要生成的数据帧 (df3) 保持与原始数据帧 (df3) 相同的结构原来的(df1),我只需要添加额外的列。

这种操作有内置函数吗?

【问题讨论】:

  • 更多行的存在表明您在任一输入帧中都有重复的ID。您的示例数据不会发生这种情况,因此您不会得到它。如果您想删除重复项,您需要(向我们和 R)提供一些关于如何做到这一点的逻辑,没有一般的方法可以始终做到这一点。

标签: r dataframe inner-join


【解决方案1】:
merge(Df1, Df2, by = "ID")
#     ID Information Characteristic
# 1 11AA       info1          char1
# 2 22BB       info2          char2
# 3 22BB       info2          char2
# 4 33CC       info3          char3
# 5 44DD       info4          char4

如果您也需要不匹配项(因为您的数据有一个 11AB 而另一个没有),请使用 all=TRUE(或 all.x=all.y,您的选择)。

merge(Df1, Df2, by = "ID", all=TRUE)
#     ID Information Characteristic
# 1 11AA       info1          char1
# 2 11AB       info1           <NA>
# 3 22BB       info2          char2
# 4 22BB       info2          char2
# 5 33CC       info3          char3
# 6 44DD       info4          char4

数据

Df1 <- structure(list(ID = c("11AA", "22BB", "33CC", "44DD", "11AB", "22BB"), Information = c("info1", "info2", "info3", "info4", "info1", "info2")), class = "data.frame", row.names = c(NA, -6L))
Df2 <- structure(list(ID = c("11AA", "22BB", "33CC", "44DD"), Characteristic = c("char1", "char2", "char3", "char4")), class = "data.frame", row.names = c(NA, -4L))

【讨论】:

  • 其实我还以为是stackoverflow.com/q/1299871/3358272的骗子。我正在等待他们回来解释“更多行”问题。
  • 非常感谢您的回答。实际上 11AB 条目是一个错字,我将编辑示例以便清楚。我尝试了 merge() 函数,但我仍然得到比原始数据框更多的行。但是,原始数据框中完全有可能存在重复项,我不应该将其删除。我也想我以前看过你在这里链接的帖子。有没有办法可以将生成的数据框与原始数据框进行比较,以查看正在添加的行?
  • Juan,您更新的数据和您的inner_join 代码产生了 6 行,因此没有证据表明您的“额外行”。
【解决方案2】:

您正在寻找外连接。

library(dplyr)

df3<- left_join(df1, df2, by = c("ID"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2020-03-13
    • 2020-08-20
    相关资源
    最近更新 更多