ddply()并使用长度来计算R中特定的一组行

时间:2014-12-11 23:32:58

标签: r plyr

希望有人可以帮助我解决这个看似简单的问题,我无法弄清楚!

name = c('alan', 'alan', 'alan','alan', 'alan', 'alan', 'albert','albert','albert', 'alvin','alvin','alvin','alvin')
var = c(0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0 ,0)
df = data.frame(name, var)

我拥有的数据集如下:

     name var
1    alan 0
2    alan 1
3    alan 0
4    alan 1
5    alan 1
6    alan 0
7  albert 0
8  albert 0
9  albert 1
10  alvin 1
11  alvin 1
12  alvin 0
13  alvin 0

我想使用ddply来计算所有1,但每个名称。换句话说,艾伦应该得到三个1,阿尔伯特得到一个1,而阿尔文得到两个1。 所以理想的输出是:

           name counter
    1   alan          3
    2 albert          1
    3  alvin          2

这里有我无法使用的代码:

df.ddply = ddply(df, c('name'), transform, counter=length(df[df['var']>0, 'var']))

我想在这里使用长度函数的原因是因为var列的值可以是0-9。

这是上一行的输出:

    name counter
1   alan          6
2 albert          6
3  alvin          6

我在这里遗漏了什么吗?非常感谢任何输入!

3 个答案:

答案 0 :(得分:6)

这里不需要plyr,它比基础R更快或更容易阅读。只需使用agggregate

aggregate(var ~ name, df, function(x) sum(x == 1))
#     name var
# 1   alan   3
# 2 albert   1
# 3  alvin   2

或尝试tapply

tapply(df$var, df$name, function(x) sum(x == 1))
# alan albert  alvin 
#    3      1      2 

使用dplyr

的另一种可能的解决方案
library(dplyr)
df %>% 
  group_by(name) %>%
  tally(var == 1)
# Source: local data frame [3 x 2]
# 
#     name n
# 1   alan 3
# 2 albert 1
# 3  alvin 2

虽然我选择的工具始终是data.table

library(data.table)
setDT(df)[, .(counter = sum(var == 1)), name]
#      name counter
# 1:   alan       3
# 2: albert       1
# 3:  alvin       2

或(如@Arun提到的)

setDT(df)[var == 1, .(counter = .N), name]

虽然对于大数据集来说这应该是最快的(键控by结合二分搜索)

setkey(df, var)[J(1), .(counter = .N), name]

答案 1 :(得分:3)

如果你想坚持plyr

df.ddply <- ddply(df, "name", summarise, counter=length(var[var == 1]))

答案 2 :(得分:1)

这是dplyr(plyr的继任者)的方式

library(dplyr)
counts <- df %>%
            group_by(name) %>%
            summarise(
              counter = sum(var))