2012-07-10 3 views
2

두 개의 Id 변수와 name 변수가있는 데이터 프레임이 있습니다. 이러한 변수의 조합에는 여러 가지 다른 수가 있습니다.데이터 프레임 행 결합

## dput'ed data.frame 
df <- structure(list(V1 = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L), .Label = c("A", 
"B", "C", "D", "E"), class = "factor"), V2 = c(1L, 2L, 3L, 1L, 
2L, 3L, 2L, 2L, 1L, 3L, 1L, 2L, 1L, 3L, 2L, 1L, 1L, 3L, 1L, 1L 
), V3 = structure(c(1L, 2L, 3L, 1L, 2L, 3L, 2L, 2L, 1L, 3L, 1L, 
2L, 1L, 3L, 2L, 1L, 1L, 3L, 1L, 1L), .Label = c("test1", "test2", 
"test3"), class = "factor")), .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c(NA, 
-20L)) 
>df 
    V1 V2 V3 
1 A 1 test1 
2 B 2 test2 
3 C 3 test3 
4 D 1 test1 
5 E 2 test2 
6 A 3 test3 
7 B 2 test2 
8 C 2 test2 
9 D 1 test1 
10 E 3 test3 
11 A 1 test1 
12 B 2 test2 
13 C 1 test1 
14 D 3 test3 
15 E 2 test2 
16 A 1 test1 
17 B 1 test1 
18 C 3 test3 
19 D 1 test1 
20 E 1 test1 

나는 결과 하나만 V1 당 엔트리 한 후 상기 제 2 및 제 3 등의 값 한다거나 할 쉼표로 구분을 갖도록 행을 결합하려는. 좋아요 :

f V2   V3 
1 A 1 ,3 ,1 ,1 test1 ,test3 ,test1 ,test1 
2 B 2 ,2 ,2 ,1 test2 ,test2 ,test2 ,test1 
3 C 3 ,2 ,1 ,3 test3 ,test2 ,test1 ,test3 
4 D 1 ,1 ,3 ,1 test1 ,test1 ,test3 ,test1 
5 E 2 ,3 ,2 ,1 test2 ,test3 ,test2 ,test1 

나는 약간 느린 경우 다음 코드를 사용해 보았습니다. 더 빠른 솔루션에 대한 제안 사항이 있습니까?

df = lapply(levels(df$V1), function(f){ 
    cbind(f, 
     paste(df$V2[df$V1==f],collapse=" ,"), 
     paste(df$V3[df$V1==f],collapse=" ,")) 
}) 
df = as.data.frame(do.call(rbind, df)) 
df 

편집 : 수정 dput (DF)

+0

는'dput 것 같은데 "변환 할 데이터가 아닌 원하는 결과를 얻었습니다. –

+0

죄송합니다. 지금 고쳐야합니다 –

+0

속도가 유일한 것입니까? 출력은 또한 모든 값을 단일. 자열로 접음으로써 데이터를 다소 제한합니다. 'aggregate'를 사용하면이를 피할 수 있습니다. 출력의 각 열은 이전 데이터 형식으로 쉽게 되돌릴 수있는 목록입니다. – A5C1D2H2I1M1N2O1R2T1

답변

3

V3 (또는 다른 요인 변수) 모드 as.character에 있는지 확인하고 사용 aggregate :

df$V3 = as.character(df$V3) 
aggregate(df[-1], by=list(df$V1), c, simplify=FALSE) 
# Group.1   V2       V3 
# 1  A 1, 3, 1, 1 test1, test3, test1, test1 
# 2  B 2, 2, 2, 1 test2, test2, test2, test1 
# 3  C 3, 2, 1, 3 test3, test2, test1, test3 
# 4  D 1, 1, 3, 1 test1, test1, test3, test1 
# 5  E 2, 3, 2, 1 test2, test3, test2, test1 
0
do.call("rbind", lapply(split(df[, 2:3], df[,1]), function(x) sapply(x, paste, collapse=","))) 
    V2  V3      
A "1,3,1,1" "test1,test3,test1,test1" 
B "2,2,2,1" "test2,test2,test2,test1" 
C "3,2,1,3" "test3,test2,test1,test3" 
D "1,1,3,1" "test1,test1,test3,test1" 
E "2,3,2,1" "test2,test3,test2,test1"