提问者:小点点

使用Dplyr添加比例列


假设我有以下数据帧,它也被更改为包括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

共3个答案

匿名用户

也许这有帮助

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

匿名用户

  test_df %>% group_by(Y) %>%
  summarise( z0 = sum(Z == 0), z1 = sum(Z == 1) , PropZ = z1/n())
  

匿名用户

我不确定你的预期输出是什么,但下面可能有一些选择

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