【问题标题】:Adding a Proportion Column with Dplyr使用 Dplyr 添加比例列
【发布时间】:2021-03-15 23:58:29
【问题描述】:

假设我有以下数据框,它也被更改为包含 a、b 和 c 的计数,具体取决于它们是按 Z = 0 还是 1 分类

X <- (1:10)
Y<-  c('a','b','a','c','b','b','a','a','c','c')
Z <- c(0,1,1,1,0,1,0,1,1,1)
test_df <- data.frame(X,Y,Z)

(以下代码由栈交换成员提供,谢谢!)

res <- test_df %>% group_by(Y,Z) %>% summarise(N=n()) %>%
  pivot_wider(names_from = Z,values_from=N,
              values_fill = 0)

如何在右侧添加一列来指示 z=1 的每个字母在该字母的所有外观中所占的比例?一个基本的总结性陈述似乎应该起作用,但我知道如何......

我的预期输出是这样的

  Z=0 Z=1 PropZ=1
a  2   2     .5
b  1   2     .66
c  0   3     1

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    也许这有帮助

    library(dplyr)
    library(tidyr)
    test_df %>%
       group_by(Y, Z) %>% 
       summarise(N = n(), .groups = 'drop') %>% 
       left_join(test_df %>%
                    group_by(Y) %>% 
                    summarise(Prop = mean(Z == 1), .groups = 'drop')) %>% 
       pivot_wider(names_from = Z, values_from = N, values_fill = 0)
    

    -输出

    # A tibble: 3 x 4
    #  Y      Prop   `0`   `1`
    #  <chr> <dbl> <int> <int>
    #1 a     0.5       2     2
    #2 b     0.667     1     2
    #3 c     1         0     3
    

    【讨论】:

    • 这为我提供了我正在寻找的东西。谢谢你。但是,据我了解,我有几个后续问题:.groups = 'drop' Likewise 做了什么,为什么我们要在其中使用命令进行另一个汇总,以及为什么需要左连接?另外,在第二个总结中,mean(Z==1) 如何提供有问题的比例?再次感谢您!
    • @PortMadeleineCrumpet .groups 部分可以从here 得到更好的解释。关于为什么要两组。您可以先使用mutate,然后将这些列也添加到group_by 中,然后汇总并删除left_join。我认为加入连接更容易理解。那么mean就是一个逻辑向量的比例。即mean(c(TRUE, TRUE, FALSE))
    • 这很有帮助。这个问题,又是为了我的理解。我对左连接进行了一些研究,我想我明白了,我们在这里用左连接做的是命令 r 将对象“trial_df”左连接到我们即将创建的东西,这是trial_df,按 Y 分组(按 a、b、c 组织),通过这些组中有多少的 Z 值为 1 的平均值进行汇总?如果这是正确的,那么我的下一个问题是,R 怎么知道然后用 1 和 0 命名 N 和 prop?我没有看到告诉它这样做的命令...
    • @PortMadeleineCrumpet 在这里,连接是在汇总数据集上,它们都具有公共列“Y”。 'N'的命名,'Prop'取自pivot_wider,当有多个列时,我们在values_from中指定
    • @PortMadeleineCrumpet 您可以从values_from 中删除“道具”,它应该会给出预期的输出。我更新了
    【解决方案2】:
      test_df %>% group_by(Y) %>%
      summarise( z0 = sum(Z == 0), z1 = sum(Z == 1) , PropZ = z1/n())
      
    

    【讨论】:

      【解决方案3】:

      我不确定您的预期输出是什么,但以下可能是一些选项

      u <- xtabs(q ~ Y + Z, cbind(test_df, q = 1))
      > u
         Z
      Y   0 1
        a 2 2
        b 1 2
        c 0 3
      

      > prop.table(u)
         Z
      Y     0   1
        a 0.2 0.2
        b 0.1 0.2
        c 0.0 0.3
      

      【讨论】:

        【解决方案4】:

        要计算每个字母 1 的比例,您可以使用 rowSums

        transform(res, prop_1 = `1`/rowSums(res[-1]))
        

        dplyr

        library(dplyr)
        
        res %>%
          ungroup %>%
          mutate(prop_1 = `1`/rowSums(.[-1]))
        
        #  Y       `0`   `1` prop_1
        #  <chr> <int> <int>  <dbl>
        #1 a         2     2  0.5  
        #2 b         1     2  0.667
        #3 c         0     3  1    
        

        【讨论】:

          猜你喜欢
          • 2017-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-13
          • 1970-01-01
          • 2018-11-20
          • 2019-09-15
          • 1970-01-01
          相关资源
          最近更新 更多