合并重复行并在R中添加列

时间:2014-12-07 06:09:23

标签: r aggregate

我想知道如何合并数据框中的重复行,然后将重复的值合并到另一列中。

以下是现有数据框架和可接受作为解决方案的两个数据框架的示例

df1 <- data.frame(col1 = c("test1", "test2", "test2", "test3"), col2 = c(1, 2, 3, 4))
df.ideal <- data.frame(col1 = c("test1", "test2", "test3"), col2 = c(1, "2, 3", 4))
df.ideal2 <- data.frame(col1 = c("test1", "test2", "test3"), 
                        col2 = c(1, 2, 4), 
                        col3 = c(NA, 3, NA))

在第一个理想数据框中,折叠重复的行,并添加两个数字列。我已经查看了有关堆栈溢出的其他类似问题,但它们都处理了组合行。我需要删除重复的行,因为我有另一个数据集,我需要合并它需要一定数量的行。所以,我想保留所有的价值观。谢谢你的帮助!

2 个答案:

答案 0 :(得分:6)

要从df1转到df.ideal,您可以使用aggregate()。

aggregate(col2~col1, df1, paste, collapse=",")
#    col1 col2
# 1 test1    1
# 2 test2  2,3
# 3 test3    4

如果你想进入df.ideal2,那么从长期到广泛的过程中,这更像是一次重塑。你可以做到

reshape(transform(df1, time=ave(col2, col1, FUN=seq_along)), idvar="col1", direction="wide")
#    col1 col2.1 col2.2
# 1 test1      1     NA
# 2 test2      2      3
# 4 test3      4     NA

仅使用基础reshape()函数。

答案 1 :(得分:2)

另一种选择是使用splitstackshape

library(data.table)
library(splitstackshape)
DT1 <- setDT(df1)[,list(col2=toString(col2)) ,col1]
DT1
#    col1 col2
#1: test1    1
#2: test2 2, 3
#3: test3    4

您可split col2 DT1获取df.ideal2

cSplit(DT1, 'col2', sep=',')
#   col1 col2_1 col2_2
#1: test1      1     NA
#2: test2      2      3
#3: test3      4     NA

或来自df1

 dcast.data.table(getanID(df1, 'col1'), col1~.id, value.var='col2')
 #   col1 1  2
 #1: test1 1 NA
 #2: test2 2  3
 #3: test3 4 NA