2015-08-24 34 views
2

我正在使用数据框,并且想要将两列合并为一列,如果两个单元格具有相同的值。R减少/合并data.frame中的列

X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 X19 X20 X21 X22 X23 X24 
1 20 30 40 54 64 74 88 98 108 122 132 142 168 178 188 202 212 222 236 246 256 270 280 290 
5 2 4 6 2 4 6 2 4 6 2 4 6 2 4 6 2 4 6 2 4 6 2 4 6 
6 6 6 6 13 13 13 20 20 20 27 27 27 6 6 6 13 13 13 20 20 20 27 27 27 

那就是我所拥有的数据集。如果第5,6行中的元素与第1行中的任何元素相结合,我想合并两列,例如,上述数据集将成为提前 编辑

X1  X2  X3  X4  X5  X6  X7  X8  X9  X10  X11  X12 
1 (20,168) (30,178) (40,188) (54,202) (64,212) (74,222) (88,236) (98,246) (108,256) (122,270) (132,280) (142,290) 
5 2  4  6  2  4  6  2  4  6   2   4   6 
6 6  6  6  13  13  13  20  20  20  27  27  27 

感谢:由paste改变行

+0

您如何决定在哪些行上进行操作?此外,你在这里合并列,而不是行。 –

+0

你完全正确。我混合了行和列。 呃,老实说不知道。从左侧开始并删除已经是合并的一部分的列? –

+0

我的意思是,你的真实数据集中只有3行,并且你总是想在第二行和第三行进行操作以查找愚蠢行为? –

回答

3

我们可以创建一个分组变量(“GR”),荷兰国际集团的第二和第三行。然后,我们用split列'gr'的顺序得到一个list输出。在列索引paste的基础上排列第一行'df1'元素(toStringpaste(., collapse=', ')的一个方便包装,并添加了一些带括号的格式,我们可以使用pastesprintf),unsplit并将输出分配给'df1'的第一行

gr <- paste(df1[2,], df1[3,]) 

lst <- split(seq_along(df1), gr) 
df1[1,] <- unsplit(lapply(lst, function(x) 
       sprintf('(%s)', toString(df1[1,x]))) , gr) 
df1 
#  X1  X2  X3  X4  X5  X6  X7 
#1 (20, 168) (30, 178) (40, 188) (54, 202) (64, 212) (74, 222) (88, 236) 
#5   2   4   6   2   4   6   2 
#6   6   6   6  13  13  13  20 
#   X8   X9  X10  X11  X12  X13  X14 
#1 (98, 246) (108, 256) (122, 270) (132, 280) (142, 290) (20, 168) (30, 178) 
#5   4   6   2   4   6   2   4 
#6  20   20   27   27   27   6   6 
#  X15  X16  X17  X18  X19  X20  X21 
#1 (40, 188) (54, 202) (64, 212) (74, 222) (88, 236) (98, 246) (108, 256) 
#5   6   2   4   6   2   4   6 
#6   6  13  13  13  20  20   20 
#   X22  X23  X24 
#1 (122, 270) (132, 280) (142, 290) 
#5   2   4   6 
#6   27   27   27 
+0

很好的解决方案。我正在考虑用'熔化'来做点什么 –

+0

@DavidArenburg谢谢,'熔化'可能会更普遍。我认为OP只有3行。 – akrun

+0

感谢您的支持。还有更多的行,我只是将它们移除以便更容易理解。 –