dplyr:将计数出现放入新变量中

use*_*672 29 r dplyr

想了解一下dplyr代码,但无法弄清楚这一点.见过这里所描述的许多变量(一个类似的问题,总结因素的计数与dplyr把值出现次数的计数横行到新的变数,如何做到在R里面有dplyr? ),但我的任务就是略小.
给定一个数据框,如何计算变量的频率并将其放在一个新变量中.

set.seed(9)
df <- data.frame(
    group=c(rep(1,5), rep(2,5)),
    var1=round(runif(10,1,3),0))
Run Code Online (Sandbox Code Playgroud)

然后我们有:

>df
   group var1
1      1    1
2      1    1
3      1    1
4      1    1
5      1    2
6      2    1
7      2    2
8      2    2
9      2    2
10     2    3
Run Code Online (Sandbox Code Playgroud)

想要第三列指示每组(group)var1发生多少次,在这个例子中,这将是:count =(4,4,4,4,1,1,3,3,3,1).我试过 - 没有成功 - 比如:

df %>%  group_by(group) %>% rowwise() %>% do(count = nrow(.$var1))
Run Code Online (Sandbox Code Playgroud)

解释非常感谢!

tal*_*lat 43

您需要做的就是按两列"group"和"var1"对数据进行分组:

df %>% group_by(group, var1) %>% mutate(count = n())
#Source: local data frame [10 x 3]
#Groups: group, var1
#
#   group var1 count
#1      1    1     4
#2      1    1     4
#3      1    1     4
#4      1    1     4
#5      1    2     1
#6      2    1     1
#7      2    2     3
#8      2    2     3
#9      2    2     3
#10     2    3     1
Run Code Online (Sandbox Code Playgroud)

评论后编辑

这是一个你不应该怎么做的例子:

df %>% group_by(group, var1) %>% do(data.frame(., count = length(.$group)))
Run Code Online (Sandbox Code Playgroud)

dplyr实现n()肯定更快,更清晰,更短,并且应始终优先于上述实现.


小智 15

也许这是新功能,但可以使用一个dplyr命令完成:

df %>% add_count(group, var1)
   group  var1     n
 1     1     1     4
 2     1     1     4
 3     1     1     4
 4     1     1     4
 5     1     2     1
 6     2     1     1
 7     2     2     3
 8     2     2     3
 9     2     2     3
10     2     3     1
Run Code Online (Sandbox Code Playgroud)


KFB*_*KFB 10

我们可以使用大概另一个方便的功能,tallydplyr

df %>% group_by(group, var1) %>% tally()
# Source: local data frame [5 x 3]
# Groups: group
# 
#   group var1 n
# 1     1    1 4
# 2     1    2 1
# 3     2    1 1
# 4     2    2 3
# 5     2    3 1
Run Code Online (Sandbox Code Playgroud)

  • 我同意!所以beginneR的答案就是我的想法,即将结果添加到保持行数的数据框架结构中. (2认同)

Jaa*_*aap 7

两种选择:

1:以R为底:

# option 1:
df$count <- ave(df$var1, df$var1, df$group, FUN = length)
# option 2:
df <- transform(df, count = ave(var1, var1, group, FUN = length))
Run Code Online (Sandbox Code Playgroud)

这使:

> df
   group var1 count
1      1    1     4
2      1    1     4
3      1    1     4
4      1    1     4
5      1    2     1
6      2    1     1
7      2    2     3
8      2    2     3
9      2    2     3
10     2    3     1
Run Code Online (Sandbox Code Playgroud)

2:使用

library(data.table)
setDT(df)[, count:=.N, by = .(group, var1)]
Run Code Online (Sandbox Code Playgroud)

得到相同的结果:

> df
    group var1 count
 1:     1    1     4
 2:     1    1     4
 3:     1    1     4
 4:     1    1     4
 5:     1    2     1
 6:     2    1     1
 7:     2    2     3
 8:     2    2     3
 9:     2    2     3
10:     2    3     1
Run Code Online (Sandbox Code Playgroud)

如果要总结,可以使用:

# with base R:
aggregate(id ~ group + var1, transform(df, id = 1), length)

# with 'dplyr':
count(df, group, var1)

# with 'data.table':
setDT(df)[, .N, by = .(group, var1)]
Run Code Online (Sandbox Code Playgroud)