【问题标题】:Grouping and Counting instances?分组和计数实例?
【发布时间】:2015-09-01 12:23:02
【问题描述】:

是否可以使用 R (dplyr) 对所有其他列的实例进行分组和计数?例如,以下数据框

x  a  b  c
1  0  0  0
1  1  0  1
1  2  2  1
2  1  2  1

转至此(注意:y 是正在计算的值)

编辑:- 解释转换,x 是我分组的依据,对于每个分组的数字,我想计算提到 0 和 1 和 2 的次数,就像在转换后的数据帧的第一行中一样,我们计算了多少次 x = 1 在其他列 (y) 中等于 0,因此 0 在 a 列中一次,b 列两次,c 列一次

x  y  a  b  c
1  0  1  2  1
1  1  1  0  2
1  2  1  1  0
2  1  1  0  1
2  2  0  1  0

【问题讨论】:

    标签: r dplyr plyr


    【解决方案1】:

    结合了 data.tablereshape2meltdcast 函数的方法:

    library(data.table) # v1.9.5+
    dt.new <- dcast(melt(setDT(df), id.vars="x"), x + value ~ variable)
    

    这给出了:

    dt.new
    #    x value a b c
    # 1: 1     0 1 2 1
    # 2: 1     1 1 0 2
    # 3: 1     2 1 1 0
    # 4: 2     1 1 0 1
    # 5: 2     2 0 1 0
    

    dcast 中,您可以指定要使用的聚合函数,但在这种情况下这不是必需的,因为默认聚合函数是length。如果不使用聚合函数,您将收到一个警告:

    缺少聚合函数:默认为长度

    此外,如果您没有将数据帧显式转换为数据表,data.table 将重定向到reshape2(参见 cmets 中 @Arun 的解释)。因此,此方法也可以与 reshape2 一起使用:

    library(reshape2)
    df.new <- dcast(melt(df, id.vars="x"), x + value ~ variable)
    

    使用的数据:

    df <- read.table(text="x  a  b  c
    1  0  0  0
    1  1  0  1
    1  2  2  1
    2  1  2  1", header=TRUE)
    

    【讨论】:

    • 我一直以为dcast来自reshape2,而不是data.table。或者data.table 是否提供dcast 的特定实现(因为它是一个通用函数)。在这种情况下,我们是否需要先将df 转换为某种data.table 格式?
    • @PaulHiemstra data.table 的最新版本现在也是 includes its own implementations of the melt and dcast functions。起初我还认为您需要使用setDT(),但显然这不是必需的,它也适用于数据帧(我当然在发布之前尝试过;-))。
    • 除非您转换为数据表,否则不会使用数据表方法。
    • 如果对象不是数据表,数据表将重定向到 reshape2。检查 data.table::dcast
    • @akrun true,将其添加到我的答案中
    【解决方案2】:

    我会使用tidyr 包中的gatherspread 以及dplyr 中的count 的组合:

    library(dplyr)
    library(tidyr)
    df = data.frame(x = c(1,1,1,2), a = c(0,1,2,1), b = c(0,0,2,2), c = c(0,1,1,1))
    res = df %>% 
        gather(variable, value, -x) %>% 
        count(x, variable, value) %>% 
        spread(variable, n, fill = 0)
    # Source: local data frame [5 x 5]
    #
    #   x value a b c
    # 1 1     0 1 2 1
    # 2 1     1 1 0 2
    # 3 1     2 1 1 0
    # 4 2     1 1 0 1
    # 5 2     2 0 1 0
    

    本质上,您首先将数据集的格式更改为:

    head(df %>% 
        gather(variable, value, -x))
    #  x variable value
    #1 1        a     0
    #2 1        a     1
    #3 1        a     2
    #4 2        a     1
    #5 1        b     0
    #6 1        b     0
    

    这允许您使用count 获取有关某些值在ac 列中出现频率的信息。之后,您使用 spread 将数据集重新格式化为所需的格式。

    【讨论】:

    • 如果你喜欢,你可以自己添加一个 dcast 融化的例子(并在一些点上耙;))。我现在经常使用dplyr,并专注于此。
    • 没关系。这与您展示的方法相同。所以,我认为在你的帖子中添加是有意义的。否则,我会将其作为评论留下。谢谢。
    猜你喜欢
    • 2013-11-23
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多