【问题标题】:Tabulating list of values in third variable in RR中第三个变量中的值列表
【发布时间】:2014-08-20 11:18:06
【问题描述】:

我有以下数据:

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 的表/矩阵,但每个单元格都应该有一个 col3 条目的列表,用于该组 col1 和 col2。我期望以下输出:

    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

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

【问题讨论】:

    标签: r


    【解决方案1】:

    一个选项:

    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"
    

    【讨论】:

    • 我正要发布这个略有不同的答案,它基于相同的原则: library(plyr) test=ddply(ddf2,c("col1","col2"),summarise, unique =paste(unique(col3),collapse=",")) dcast(test,col1~col2,value.var="unique")
    • 感谢您的回答。为什么tapply在这里不起作用: with(ddf2, tapply(col3, list(col2,col1), FUN = function(x) paste0(unique(x)))) ;它提供如下条目:字符、2 等。
    • @rnso,我用tapply添加了一个例子。
    • @beginneR:太好了。我正在尝试'c'功能。有什么办法可以吗?
    • 运行d &lt;- with(ddf2, tapply(col3, list(col1,col2), FUN = function(x) c(x))),然后检查str(d)。您会注意到您需要的信息实际上在那里,但无法显示或不符合正常的 data.frame 结构(我知道这个描述可能不准确,但我不知道该怎么做形容它)。基本上,我认为问题是c() 返回一个向量,但您不能在 data.frame 的单个“单元格”中显示向量。这就是为什么你应该改用paste
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2021-02-13
    • 1970-01-01
    • 2019-10-08
    相关资源
    最近更新 更多