R: dplyr 可以按组计算百分比吗?

R: can dplyr calculate percents by group?

我正在使用 R 中的 dplyr 库。

我创建了以下数据集:

library(dplyr)
 #create data
 a = rnorm(100,100,10)
 b = rnorm(100,100,10)
group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.2, 0.15, 0.15) )

#create frame
 train_data = data.frame(a,b,group)
train_data$group = as.factor(train_data$group)
 

从这里开始,我想创建一个名为“diff”的新变量,用于记录变量“b”是否大于变量“a”:

train_data$diff = ifelse(train_data$b > train_data$a,1,0)

现在,我想在“train_data”table 中创建一个新变量(“perc”),它计算:

例如

使用另一个 Whosebug post,() 我试图实现这个:

final_table = data.frame(train_data %>% group_by(group) %>% mutate(perc = diff/max(diff)))

但这并没有给我想要的输出:

head(final_table)

               a         b group diff perc
1   107.19028 117.37028     D    1             1
2   105.34165  87.96513     A    0             0
3   120.21911  94.30301     C    0             0
4    98.06001 104.82173     D    1             1
5   104.54841  90.00205     B    0             0
6    90.77172  79.31384     D    0             0
7    96.22783  88.60185     D    0             0
8   113.67500  87.28380     B    0             0
9    96.82708  89.51343     C    0             0
10  115.38720 100.79550     C    0             0
11  105.30922  80.55969     C    0             0
12  114.93315  95.78172     B    0             0
13  105.20058 109.66729     C    1             1

例如,第11行和第13行都有“group = c”,但“perc”变量的值不同。此外,这里似乎没有计算百分比。

有人可以告诉我如何解决这个问题吗?

注意:是否也可以创建一个包含 4 行的 table 来提供摘要?我认为 Count = n() 命令可以用于此?

例如

Group  Number of Rows    Perc
a            20           0.6
b            20           0.7
c            50           0.9
d            10           0.24

或一般性总结(即在整个 table 中,“diff”变量为 1 的行的百分比是多少?):

d = sum(train_data$diff) / count(train_data$diff)

谢谢

如果我误解了你的问题,请告诉我:

library(dplyr)

#create data
a = rnorm(100,100,10)
b = rnorm(100,100,10)
group <- sample( LETTERS[1:4], 100, replace=TRUE, prob=c(0.5, 0.2, 0.15, 0.15) )

#create frame
train_data = data.frame(a,b,group)


# Question 1
train_data %>% 
  group_by(group) %>% 
  mutate(
    percent = sum(a>b)/n()
  )
#> # A tibble: 100 x 4
#> # Groups:   group [4]
#>        a     b group percent
#>    <dbl> <dbl> <chr>   <dbl>
#>  1  95.0  88.9 B       0.429
#>  2  96.4  95.1 A       0.35 
#>  3 102.  110.  A       0.35 
#>  4  97.4  96.2 A       0.35 
#>  5  90.7  92.7 A       0.35 
#>  6  92.0 105.  B       0.429
#>  7  93.8  85.1 A       0.35 
#>  8 101.  102.  B       0.429
#>  9  92.0  99.1 A       0.35 
#> 10  77.6  87.8 B       0.429
#> # ... with 90 more rows

# Question 2
train_data %>% 
  group_by(group) %>% 
  summarize(
    rows= n(),
    percent = sum(a>b)/n()
  )
#> # A tibble: 4 x 3
#>   group  rows percent
#>   <chr> <int>   <dbl>
#> 1 A        60   0.35 
#> 2 B        21   0.429
#> 3 C         8   0.375
#> 4 D        11   0.364

reprex package (v2.0.0)

创建于 2021-07-02