【问题标题】:dplyr: put count occurrences into new variable [duplicate]dplyr:将计数出现到新变量中[重复]
【发布时间】:2015-01-03 05:57:29
【问题描述】:

想了解一下 dplyr 代码,但想不通。对于许多变量(summarizing counts of a factor with dplyrPutting rowwise counts of value occurences into new variables, how to do that in R with dplyr?),已经看到了此处描述的类似问题,但是我的任务要小一些。
给定一个数据框,我如何计算一个变量的频率并将其放入一个新变量中。

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

那么我们有:

>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

希望第三列指示每个组 (group) 出现了多少次var1,在本例中为:count=(4,4,4,4,1,1,3,3 ,3,1)。 我试过了——没有成功——比如:

df %>%  group_by(group) %>% rowwise() %>% do(count = nrow(.$var1))

非常感谢您的解释!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您只需按“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
    

    评论后编辑

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

    df %>% group_by(group, var1) %>% do(data.frame(., count = length(.$group)))
    

    使用n() 的 dplyr 实现肯定更快、更简洁、更短,并且应该始终优于上述实现。

    【讨论】:

    • 好@beginneR!因此,如果我有更多的列,如 ID、名称等,我仍然应该只将我感兴趣的两个分组?
    • @user3375672,如果除了现有的两个(“group”和“var1”)之外还有另一个分组变量,例如,称为“ID”,您可以按这三列对数据进行分组,然后然后在我的回答中使用 mutate 和 n() 。
    • 仍然,我不明白,为什么我不能替换 nrow() 而不是 dplyr 中的 n() 函数
    • 嗯,这主要是因为您正在使用 dplyr,它具有许多旨在使用 dplyr 语法的特殊功能,n() 就是其中之一。从技术上讲,您可以在 dplyr 中的 do() 语句中使用基本 R 函数 nrow(),但这会很有意义,因为 dplyr 的特殊功能让您的生活变得如此轻松。
    • 如果你有大量数据,这个命令是SUPERFAST
    【解决方案2】:

    也许这是新功能,但可以通过一个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
    

    【讨论】:

    • 如果你有大量数据,这个命令是SUPERFAST
    【解决方案3】:

    我们可能会使用来自dplyr 的另一个方便的函数tally

    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
    

    【讨论】:

    • 如果这是你想要的结果(根据问题,它不是)你甚至可以使用df %&gt;% count(group, var1)
    • @beginneR,是的,取决于我们如何理解所需的输出格式。这看起来更简洁,因为它只显示唯一的对。
    • 我同意,在再次阅读 Q 之后,它不是 100% 清楚。无论如何,这是一个不错的选择。
    • 我同意!所以 beginneR 的答案就是我的想法,即将结果添加到数据框结构中,保持行数。
    • 我正在使用这个解决方案,但是我需要将结果放回我的长格式数据框中。谁能告诉我该怎么做?
    【解决方案4】:

    两种选择:

    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))
    

    给出:

    > 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
    

    2::

    library(data.table)
    setDT(df)[, count:=.N, by = .(group, var1)]
    

    给出相同的结果:

    > 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
    

    如果要总结,可以使用:

    # 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)]
    

    【讨论】:

    • 不明白为什么df$count &lt;- ave(df$var1, df$group, FUN = length) 不起作用。为什么需要指定两次var1
    • 如果你有大量数据,这个命令是超级慢的。更喜欢其他人。
    • RE 第一条评论:第一个var1 是长度函数的输入,第二个var1 用作分组变量(与group 一起)。 RE 第 2 条评论:如果您有大量数据,请使用 data.table 选项;它是 R 生态系统中最快的。
    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多