希望有人可以帮助我解决这个看似简单的问题,我无法弄清楚!
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
我在这里遗漏了什么吗?非常感谢任何输入!
答案 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))