计算数据框中值的唯一组合和汇总值

Posted

技术标签:

【中文标题】计算数据框中值的唯一组合和汇总值【英文标题】: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

【问题讨论】:

扩展答案以解决您的后续问题 【参考方案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)

以上是关于计算数据框中值的唯一组合和汇总值的主要内容,如果未能解决你的问题,请参考以下文章

如何计算熊猫数据框中每一列的唯一性?

在R中顺序计算列的中位数并将值存储在数据框中

根据第一列中的唯一值计算第二列中值的出现次数

循环遍历数据框:计算每个唯一变量的值的每个成对组合。

Matplotlib 箱线图使用预先计算(汇总)统计

python,计算数据框中列表的唯一列表值