【问题标题】:Mutating per group, then ungrouping每组变异,然后解组
【发布时间】:2020-12-11 10:51:24
【问题描述】:

已编辑

我有一个 data.frame,我想按某些列(下面的 y)进行分组,在每个组中选择不同的行(w.r.t. y 和下面的 z),然后添加一个指定的新列每组的列数。然后取消组合以返回 data.frame,包括新列。

例子:

df <- data.frame(x=c(1,2,3,4),y=c(10,10,10,20),z=c(100,100,101,200))

x y  z   
1 10 100 
2 10 100 
3 10 101 
4 20 200 

我想接收data.frame:

x y  z   n
1 10 100 2
3 10 101 2
4 20 200 1

前两行有n=2,因为它们的y 相同,但z 的值不同。

【问题讨论】:

  • 分组变量的名称是什么?
  • @sindri_baldur 很抱歉造成混乱,我再次编辑了问题以使其更清晰

标签: r dplyr


【解决方案1】:

我猜你可以在 data.table 中做它作为替代

library(data.table)
setDT(df)
df[,.(n := .GPR ), y]

但我猜你想要的结果可以通过

df[,.(n := .GPR ), .(y,z)]

【讨论】:

    【解决方案2】:

    在这种情况下,您可以将以下内容与dplyr 一起使用:

    df %>% distinct(y,z,.keep_all=TRUE) %>% add_count(y)
    

    但是,x 的独特性值得怀疑,因为distinct 可能并不总是占据“正确”行。 distinct写的帮助说明

    如果给定的输入组合有多行,则仅保留第一行。如果省略,将使用所有变量。

    但在这里,它显然占据了最后一行。

    【讨论】:

      【解决方案3】:

      我们可以使用slice_head

      library(dplyr)
      df  %>%
           group_by(y, z) %>% 
           mutate(n = n()) %>% 
           slice_head(n = 1)
      # A tibble: 3 x 4
      # Groups:   y, z [3]
      #      x     y     z     n
      #  <dbl> <dbl> <dbl> <int>
      #1     1    10   100     2
      #2     3    10   101     1
      #3     4    20   200     1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        相关资源
        最近更新 更多