2

我想在我的数据框中使用var1和的独特组合var2

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

基于独特的组合,我如何获得:

  • n,值的出现次数var1
  • svar,每个var1值的var2值的总和。

输出可能如下所示:

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

3 回答 3

4

unique(foo)应该给你你所追求的。

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

我建议查看库plyr中的其他聚合类型任务,或基本 R 等价物tapply()aggregate()

虽然对于本练习来说是多余的,但以下是使用 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))

应该给你你所追求的。

于 2011-01-15T00:00:24.810 回答
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 
于 2011-01-14T23:53:13.977 回答
1

答案与您所说的不同,但我更信任我的代码而不是您的答案,而且我不能让自己犯下将变量命名为“sum”的罪行:

 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

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

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
于 2011-01-15T01:45:26.750 回答