【问题标题】:r: efficient way to merge data when there is common column and combine data when there is no common columnr:有公共列时合并数据,没有公共列时合并数据的有效方法
【发布时间】:2017-05-29 21:48:38
【问题描述】:

我有两个具有重复列的数据框,data1data2。我现在正在运行一个 for 循环,每个循环将 data1 中的一列与 data2 中的整个列合并。例如

数据1:

1 1 3 4 4 
2 5 2 4 2
2 2 8 8 0

数据2

1 4 5 4 5
2 9 3 4 5
2 7 4 8 0

columns 1 and 4data1data2 中重复。对于第一个循环,它合并

1 
2 
2

data2

1 4 5 4 5
2 9 3 4 5
2 7 4 8 0

所以想要的结果是

1 4 5 4 5
2 9 3 4 5
2 7 4 8 0

然后转到second column

 1
 5
 2

它与data2合并

    1 4 5 4 5
    2 9 3 4 5
    2 7 4 8 0

想要的结果是

    1 1 4 5 4 5
    5 2 9 3 4 5
    2 2 7 4 8 0

我的想法是使用combine或者merge函数,但是这两个函数都没有达到想要的输出

for(i in 1:dim(data[2])){
  datam_merge<- merge(data1[i], data2)
}

欢迎提出任何建议!

【问题讨论】:

  • 重复的列是否总是在两个数据集中的相同位置(如您的示例中)?然后你可以简单地比较它们,然后只是cbind。像indx &lt;- colSums(data2 == data1) != nrow(data2) ; cbind(data2, data1[, indx]) 这样的东西。此外,您使用 merges 术语的方式对我来说没有意义 - 您可以忽略其中一个并继续前进,而不是合并重复的列,为什么要合并它们?

标签: r merge


【解决方案1】:

这应该可以解决问题:

data3 <- dplyr::left_join(data2, data1)
head(data3)

left_join() 函数确定 data2 与 data1 有哪些相同的列,然后只连接从 data1data2 的不同列。

我注意到您的“期望结果”正在从data1 中删除第 5 列。这是故意的,还是您想要的输出是一个新的数据框,其中包含来自 data1data2 的所有列而没有任何重复?

这是另一种可能是更通用的解决方案的方法:

data3 <- dplyr::inner_join(data1, data2)

这只会连接两个数据框之间的唯一列,而不仅仅是data1

如果这就是你要找的东西,请告诉我!

编辑: 这是我的例子:

data1 <- data.frame(c(1,2,2),c(1,5,2),c(3,2,8),c(4,4,8),c(4,2,0))
names(data1) <- c("A","B","C","D","E")
data2 <- data.frame(c(1,2,2),c(4,9,7),c(5,3,4),c(4,4,8),c(5,5,0))
names(data2) <- c("A","F","G","D","H")

## columns 'A' and 'D' are in common, but we only need one of each letter ('A' through 'E').
data3 <- left_join(data2, data1)
head(data3)
  A F G D H B C E
1 1 4 5 4 5 1 3 4
2 2 9 3 4 5 5 2 2
3 2 7 4 8 0 2 8 0

【讨论】:

  • 不,dplyr::left_join 将仅通过公共列名加入(如果未另行指定),这意味着它将通过 all 列加入,您只会得到@987654333 @back(这不是所需的输出)。而dplyr::left_join 将返回并清空数据框。您是否检查过您的结果并将其与所需的输出进行比较?
  • 是的,我检查了我的结果。在这种情况下,left_join()inner_join() 的输出都提供了一个具有 8 个唯一列的新数据帧(删除了 2 个重复向量)。通过可重现的示例查看我的编辑。
  • 那是因为你的列名是由它们所包含的值自动设置的。我怀疑这在现实生活中是否正确,例如没有人将c.1..2..2. 作为列名。顺便说一句,不需要领导 dplyr 来做一个简单的merge
  • 我只是按照给我的例子工作。我已经验证当列正确命名时它仍然有效。请参阅我的第二次编辑。
  • 你在开玩笑吗?您正在手动设置列名,当它们被复制时它们将具有相同的名称?为什么AD 在两个数据集中都相同?因为您观察了数据集并确定它们是骗子?试试names(data2) &lt;- names(data1) &lt;- paste0("V", 1:5)
猜你喜欢
  • 2023-02-06
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-28
相关资源
最近更新 更多