【问题标题】:rbind dataframe rows with common IDsrbind 具有通用 ID 的数据帧行
【发布时间】:2018-11-17 22:22:37
【问题描述】:
df1 <- read.table(
  text = "ID   A    B    C
    1    0    0    0
    1    1    0    1
    3    1    1    1", header = T
)

df2 <- read.table(
  text = "ID   A    B    C
    1    49   49   32
    8    2    9    3
    9    4    2    0", header = T
)

结果

ID   A    B    C
1    0    0    0
1    1    0    1
1    49   49   32

我需要制作一个由原始数据框的所有列组成的数据框(它们已经由相同的列组成),其中两个原始数据框都有一些共同的 ID。在示例中,df1 和 df2 都有 ID 为 1 的行,因此结果数据帧包含两个数据帧中 ID 为 1 的所有行。

【问题讨论】:

  • 你试过什么r 代码? (将其编辑到您的问题中)
  • 嘿内特,没有尝试太多,因为我不知道该怎么做——我不相信合并对我有用,但它是我唯一想到的
  • 您的意思是要选择具有给定 ID 的行,然后将它们绑定在一起?
  • OP 说它基于ID 列的交集
  • @rdk 下次用read.table() 的格式发数据,免得别人找你输入数据

标签: r


【解决方案1】:

您首先使用intersect 获得常见的IDs,然后使用子集和rbind 两个数据帧-

valid_ids <- intersect(df1$ID, df2$ID)

rbind(df1[df1$ID %in% valid_ids, ], df2[df2$ID %in% valid_ids, ])

  ID  A  B  C
1  1  0  0  0
2  1  1  0  1
3  1 49 49 32

【讨论】:

    【解决方案2】:

    这是tidyverse的选项

    library(tidyverse)
    list(df1, df2) %>% 
        bind_rows(.id = 'grp') %>% 
        group_by(ID) %>% 
        filter(n_distinct(grp) > 1) %>% 
        select(-grp)
    # A tibble: 3 x 4
    # Groups:   ID [1]
    #     ID     A     B     C
    #  <int> <int> <int> <int>
    #1     1     0     0     0
    #2     1     1     0     1
    #3     1    49    49    32
    

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 2013-12-01
      • 2012-10-13
      • 2023-04-10
      • 2022-10-02
      相关资源
      最近更新 更多