列表中R中第三个变量的值列表

时间:2014-08-20 11:18:07

标签: r

我有以下数据:

ddf2 = structure(list(col1 = c(3, 3, 2, 1, 1, 1, 3, 2, 1, 1, 3, 1, 1, 
2, 1, 1, 1, 2, 3, 1, 1, 3, 2, 3, 3), col2 = c("c", "c", "b", 
"b", "b", "a", "b", "c", "b", "b", "c", "c", "b", "b", "a", "c", 
"c", "b", "a", "b", "b", "c", "a", "c", "a"), col3 = c("C", "E", 
"E", "B", "D", "E", "C", "C", "E", "E", "C", "A", "D", "D", "C", 
"E", "A", "A", "A", "D", "A", "A", "B", "A", "E")), .Names = c("col1", 
"col2", "col3"), row.names = c(NA, 25L), class = "data.frame")

head(ddf2)
  col1 col2 col3
1    3    c    C
2    3    c    E
3    2    b    E
4    1    b    B
5    1    b    D
6    1    a    E

对于col1和col2的每个组合,col3可能有很多值:

with(ddf2, ddf2[col1==1 & col2=='b',])
   col1 col2 col3
4     1    b    B
5     1    b    D
9     1    b    E
10    1    b    E
13    1    b    D
20    1    b    D
21    1    b    A


with(ddf2, table(col1, col2))
    col2
col1 a b c
   1 2 7 3
   2 1 3 1
   3 2 1 5

我想创建一个col1和col2的表/矩阵,但是每个单元格应该有一组col1和col2的唯一col3条目列表。我期待以下输出:

    col2
col1    a       b           c
1       E,C     A,B,D,E     A,E
2       B       A,D,E       C
3       A,E     C           A,C,E

我试过以下但不起作用:

with(ddf2, tapply(col3, list(col1,col2), c))
  a           b           c          
1 Character,2 Character,7 Character,3
2 "B"         Character,3 "C"        
3 Character,2 "C"         Character,5

如何做到这一点?谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

一个选项:

d <- with(ddf2, aggregate(col3 ~ col2 + col1, FUN = function(x) paste0(unique(x))))
library(reshape2)
dcast(d, col1 ~ col2, value.var = "col3")
#  col1    a          b       c
#1    1 E, C B, D, E, A    A, E
#2    2    B    E, D, A       C
#3    3 A, E          C C, E, A

最有可能在一个步骤中执行这两个步骤,但我会慷慨地将其留给其他人来解决这个问题;)

或者

library(dplyr)
library(tidyr)

ddf2 %>%
  group_by(col1, col2) %>%
  summarise(col3 = paste(unique(col3), collapse = ", ")) %>%
  spread(col2, col3)

#Source: local data frame [3 x 4]
#
#  col1    a          b       c
#1    1 E, C B, D, E, A    A, E
#2    2    B    E, D, A       C
#3    3 A, E          C C, E, A

评论后编辑:

刚刚使用tapply进行了测试,这似乎有效(问题显然在于调用c()):

with(ddf2, tapply(col3, list(col1,col2), FUN = function(x) paste(unique(x), collapse = ", ")))
#  a      b            c        
#1 "E, C" "B, D, E, A" "A, E"   
#2 "B"    "E, D, A"    "C"      
#3 "A, E" "C"          "C, E, A"