【问题标题】:Delete rows from one data frame that don't exist in another and combine them从一个数据框中删除另一个数据框中不存在的行并将它们组合起来
【发布时间】:2018-02-12 06:56:53
【问题描述】:

我有 2 个这样的数据框:

df1:

ID  A  B  C
1   4  7  5
2   3  8  9
3   6  2  7
4   1  8  6
5   3  9  1
6   7  8  3

df2:

ID  D  E  F
1   6  8  9
2   2  1  1
3   6  1  9

我想从 df1 中删除 df2 中不存在的行,然后合并 2 个数据集。

期望的输出是:

df3:

ID  A  B  C  D  E  F
1   4  7  5  6  8  9
2   3  8  9  2  1  1
3   6  2  7  6  1  9

我已经尝试了以下所有方法,但没有得到正确的结果:

df1 <- df1[(df1$ID %in% df2$ID),]
df1 <- df1[(df2$ID %in% df1$ID),]
df1 <- semi_join(df1,df2)
df1 <- semi_join(df1,df2, by="ID")

我也尝试过其他的“join”方法,比如“inner_join”和“left_join”。

【问题讨论】:

  • 使用anti_joinsetdiff
  • @akrun - 恐怕 anti_join 也没有提供正确的结果。你能详细说明一下'setdiff'吗?
  • merge(df1, df2["ID"], by = "ID", all.y = T).
  • @djhurio - 谢谢,但也没有给我正确的结果。也许我的数据有问题。
  • @djhurio - 我又试了一次,合并给了我所需的结果!

标签: r join merge


【解决方案1】:

这样的事情可能会奏效:

## Random datasets
set.seed(1)
df1 <- data.frame(x = 1, y = 2, ID = sample(letters[1:24], 20))
df2 <- data.frame(ID = sample(letters[1:24], 20), a = 1, b = 2)

## Rows in common
rows_in_common <- df1$ID[df1$ID %in% df2$ID]

## Columns to use in df2
df2_cols <- 2:3

## Combine both datasets
df3 <- cbind(df1[match(sort(rows_in_common), df1$ID),],
             df2[match(sort(rows_in_common), df2$ID), df2_cols])

【讨论】:

  • 谢谢,但我仍在努力使每个数据帧中所需的行数相等。
  • 我尝试了上述但得到以下错误:[.default(xj, i) 中的错误:无效的下标类型'list'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
  • 2023-02-17
  • 2016-01-07
  • 1970-01-01
  • 2019-02-04
  • 1970-01-01
  • 2019-08-31
相关资源
最近更新 更多