2016-02-09 104 views
1

我有一些数据,其中第一列有一些重复行,认为另一列来自所有不同的数据。我需要在第一列中留下一个重复的行,并将另一列中的行与不同的行合并。例如在一行中合并唯一值

Z = c("a", "a", "b", "c", "d", "d", "d") 
X = c(10, 10, 0, 3, 4, 4, 4) 
Y = c("ab", "bc", "dv", "mh", "op", "va", "po") 
c = data.frame(Z,X,Y) 

c 

    Z X Y 
1 a 10 ab 
2 a 10 bc 
3 b 0 dv 
4 c 3 mh 
5 d 4 op 
6 d 4 va 
7 d 4 po 

我需要合并

Z X Y 
a 10 ab,bc 
b 0 dv 
c 3 mh 
d 4 op, va, po 

甚至

Z X Y L V 
a 10 ab bc 
b 0 dv 
c 3 mh 
d 4 op va po 

这可能吗?

回答

2

我们可以data.table

library(data.table) 
setDT(c)[, .(X = unique(X), Y = paste(Y, collapse = ",")), by = Z] 
# Z X  Y 
#1: a 10 ab,bc 
#2: b 0  dv 
#3: c 3  mh 
#4: d 4 op,va,po 
1

plyr包尝试是很方便的在这些情况:

library(plyr) 
ddply(c, c("Z", "X"), summarise, Y= paste(Y, collapse = ",")) 
    Z X  Y 
1 a 10 ab,bc 
2 b 0  dv 
3 c 3  mh 
4 d 4 op,va,po 
1

在基础R:

aggregate(Y ~ Z + X, data = c, toString) 

这给:

Z X   Y 
1 b 0   dv 
2 c 3   mh 
3 d 4 op, va, po 
4 a 10  ab, bc 

或用dplyr

library(dplyr) 
c %>% group_by(Z,X) %>% summarise(Y = toString(Y)) 

可以得到相同的结果。