ddply()并使用length在R中的一组特定行内计数

ddply()并使用length在R中的一组特定行内计数,r,plyr,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 al

希望有人能帮我解决这个看似简单的问题,我就是搞不懂

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']))
我之所以想在这里使用length函数,是因为var列的值可以是0-9

这是上述行的输出:

    name counter
1   alan          6
2 albert          6
3  alvin          6

我是不是遗漏了什么?非常感谢您的任何意见

这里有一种使用
dplyr
(plyr的继任者)的方法

库(dplyr)
计数%
分组单位(名称)%>%
总结(
计数器=总和(var))

这里有一种方法可以使用
dplyr
(plyr的继任者)

库(dplyr)
计数%
分组单位(名称)%>%
总结(
计数器=总和(var))

如果您想坚持使用
plyr

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

df.ddply如果您想坚持使用
plyr

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

df.ddply这里不需要
plyr
,它既不比base 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提到的)

尽管这对于大数据集来说应该是最快的(通过
与二进制搜索相结合的方式键入)


这里不需要
plyr
,它既不比base R快也不容易阅读。只需使用
aggggregate

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提到的)

尽管这对于大数据集来说应该是最快的(通过
与二进制搜索相结合的方式键入)


在本例中,您利用的是var只接受值1或0(被忽略)。您可能希望
sum(var==1)
在本例中,您正在利用该var,该var只取值1或0(被忽略)。您可能希望
sum(var==1)
我希望计算var>0的次数,因为var列的值范围为0-9。抱歉,我的问题不够明确。请参阅编辑。也看看其他的答案,有很多不错的选择!!!你能解释一下代码吗?对不起,我对R很陌生,我告诉代码按名称分组时,为什么我的代码会对所有的1进行计数而不是按名称进行计数?看看
df[df['var']>0,'var']
returns-您没有得到预期的结果,我希望计算var>0的次数,因为var列的值范围为0-9。抱歉,我的问题不够明确。请参阅编辑。也看看其他的答案,有很多不错的选择!!!你能解释一下代码吗?对不起,我对R很陌生,我告诉代码按名称分组时,为什么我的代码会对所有的1进行计数而不是按名称进行计数?看看
df[df['var']>0,'var']
返回-你没有得到你期望的答案这个问题需要回答多少次,人们才能通过一点搜索找到它?????这个问题需要回答多少次,人们才能通过一点搜索找到它?????
count
解决方案是:
count(df,name,var)%%>%filter(var==1)
。以一种紧凑的方式,
过滤(count(df,name,var),var==1)
。我们还可以对数据执行:
setDT(df)[var==1.N,by=name]
表。解决方案是:
count(df,name,var)%>%filter(var==1)
。以紧凑的方式,
过滤(count(df,name,var),var==1)
。我们还可以对data.table执行:
setDT(df)[var==1.N,by=name]