2

2つのID変数と1つの名前変数を持つデータフレームがあります。これらの変数の組み合わせには、さまざまな不均等な数があります。

## 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ごとに1つのエントリのみが含まれるように行を結合し、次に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)

4

2 に答える 2

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
于 2012-07-10T15:52:25.647 に答える
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"
于 2012-07-10T15:37:30.900 に答える