【问题标题】:A more elegant way to compute within-group proportions in dplyr? [duplicate]在 dplyr 中计算组内比例的更优雅的方法? [复制]
【发布时间】:2017-06-08 20:39:54
【问题描述】:

给定一个data_frame df <- data_frame(X = c('A', 'A', 'B', 'B', 'B'), Y = c('M', 'N', 'M', 'M', 'N')),我需要想出一个data_frame,它告诉我们A 的50% 是MA 的50% 是N,67% BMB 的 33% 是 N

我有一个小习惯,我习惯这样做,但它看起来很糟糕。

library(tidyverse)
df <- data_frame(X = c('A', 'A', 'B', 'B', 'B'), Y = c('M', 'N', 'M', 'M', 'N')) 
# here we go...
df %>% 
  group_by(X) %>% 
  mutate(n_X = n()) %>% 
  group_by(X, Y) %>% 
  summarise(PERCENT = n() / first(n_X))

哪个输出,

Source: local data frame [4 x 3]
Groups: X [?]

      X     Y   PERCENT
  <chr> <chr>     <dbl>
1     A     M 0.5000000
2     A     N 0.5000000
3     B     M 0.6666667
4     B     N 0.3333333

没有更好的方法吗?我肯定错过了什么。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    你可以使用prop.table:

    df %>% 
      group_by(X, Y) %>%
      count() %>%
      mutate(PERCENT = prop.table(n))
    

    结果:

          X     Y     n   PERCENT
      <chr> <chr> <int>     <dbl>
    1     A     M     1 0.5000000
    2     A     N     1 0.5000000
    3     B     M     2 0.6666667
    4     B     N     1 0.3333333
    

    【讨论】:

      【解决方案2】:

      我们可以使用tablerowSums 在base R 中尝试

      new_df <- table(df$X, df$Y)
      new_df/rowSums(new_df)
      
      #          M         N
      #  A 0.5000000 0.5000000
      #  B 0.6666667 0.3333333
      

      【讨论】:

        【解决方案3】:

        可能是这样的:

        dplyr

        library(dplyr)
        df %>%  count(X, Y) %>%
          mutate(prop = n / sum(n))
        

        base R

        tbl <- xtabs(~X+Y, df)
        as.data.frame(tbl/rowSums(tbl), responseName = "prop")
        

        data.table

        library(data.table)
        DT <- data.table(df)[, .N, by = .(X,Y)]
        setDT(DT)[, prop := N/sum(N), by = 'X']
        DT
        
        #   X Y N      prop
        #1: A M 1 0.5000000
        #2: A N 1 0.5000000
        #3: B M 2 0.6666667
        #4: B N 1 0.3333333
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多