【问题标题】:Calculate unique combinations of values in dataframe, and summary values计算数据框中值的唯一组合和汇总值
【发布时间】:2011-06-09 11:40:48
【问题描述】:

我想在我的数据框中使用 var1var2 的独特组合:

foo <- data.frame(var1 = c(1,1,2,2,2,2,3,3,3,3,3,4,4,4,4),
                  var2 = c(1,1,1,1,2,2,1,1,2,2,2,2,2,3,3))

如前所述,unique(foo) 会导致:

      var1  var2
 1    1     1
 2    2     1
 3    2     2
 4    3     1
 5    3     2
 6    4     2
 7    4     3

根据唯一的组合,我如何获得:

  • nvar1 值的出现次数和
  • svar,每个var1 值的var2 值之和。

输出可能如下所示:

      var1  n    svar
1     1     1    1
2     2     2    3
3     3     2    3
4     4     2    5

【问题讨论】:

  • 扩展答案以解决您的后续问题

标签: r count unique summarization


【解决方案1】:

unique(foo) 应该会给你你想要的。

2014 年更新:使用 dplyr 而不是 plyr

我建议查看库 plyr 以了解其他聚合类型任务,或 tapply()aggregate() 等的基本 R 等效项。

虽然对于本练习来说是多余的,但以下是您将如何使用 plyr:

library(plyr)
ddply(foo, .(var1), unique)

请注意,您可以将 unique 替换为任意数量的函数,例如查找 var2 的均值和 sd,如下所示:

ddply(foo, .(var1), summarise, mean = mean(var2), sd = sd(var2))

对编辑的回应

现在您可以更合法地使用plyr()。吸取我们从上面学到的知识:

x <- unique(foo)

结合plyr:

ddply(x, .(var1), summarise, n = length(var2), sum = sum(var2))

应该给你你所追求的。

【讨论】:

  • plyr 在 2014 年被 dplyr 取代,此后又被 tidyr 和相关软件包的 tidyverse 取代)
  • @smci - 如果您有精力,请随时编辑我的答案以包含更现代的工具。我个人已经转向data.table,但tidyverse 软件包在很大程度上实现了类似的目标。
  • 现在只是告诉人们使用dplyr 而不是plyr
【解决方案2】:

希望我能很好地理解你的问题,试试吧:

unique(foo)

问题编辑后:

不要写和@Chase一样,一个非常简单但不太优雅的解决方案可能是:

foo$var12 <- paste(foo$var1, foo$var2, sep='|')      # the two variables combined to one
table(foo$var12)                                     # and showing its frequencies

输出当然是表格:

 1|1 2|1 2|2 3|1 3|2 4|2 4|3 
   2   2   2   2   3   2   2 

【讨论】:

    【解决方案3】:

    答案与你所说的不同,但我更相信我的代码而不是你的答案,我不能让自己犯下将变量命名为“sum”的罪:​​p>

     newfoo <- data.frame(
                     var1=unique(foo$var1),
                     n = with(foo, tapply(var2, var1, length) ),
                     svar = with(foo, tapply(var2, var1, sum) ) )
     newfoo
    #  var1 n svar
    #1    1 2    2
    #2    2 4    6
    #3    3 5    8
    #4    4 4   10
    

    编辑:(起初并没有弄清楚 Chase 做了什么试图告诉我。)

    newfoo <- data.frame(
                      var1=unique(unique(foo)$var1),
                      n = with(unique(foo), tapply(var2, var1, length) ),
                      svar = with(unique(foo), tapply(var2, var1, sum) ) )
    
    > newfoo
      var1 n svar
    1    1 1    1
    2    2 2    3
    3    3 2    3
    4    4 2    5
    

    【讨论】:

    • 我认为这里的答案存在差异是因为 OP 正在查看对象 unique(foo) 的长度和总和,而不是他的原始数据框。好点re:命名一列“总和”。
    • 我认为这是因为他的代码中的“foo”与他的表格演示中的“foo”不同。代码向量中有 4 个“2”,但他数了 2 个“2”。
    • 第一个表格演示文稿是unique(foo),而不是foo。下表中的计数也使用unique(foo)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多