r-dplyr识别一组中的中间样本



嗨,假设我有以下数据帧。

df = read.csv("https://www.dropbox.com/s/1meyd5snt6xo9le/plot.csv?dl=1")
df = df [ order ( df$group, df$total), ]
df$pid = factor ( df$pid, levels= df$pid )
> df
pid total group
13 A13     1   Amy
14 A14     1   Amy
15 A15     1   Amy
16 A16     2   Amy
17 A17     2   Amy
18 A18     2   Amy
19 A19     2   Amy
20 A20     2   Amy
21 A21     7   Amy
22 A22     0 Cindy
23 A23     0 Cindy
24 A24     0 Cindy
25 A25     0 Cindy
26 A26     0 Cindy
27 A27     0 Cindy
28 A28     1 Cindy
29 A29     2 Cindy
30 A30     2 Cindy
31 A31     2 Cindy
32 A32     2 Cindy
33 A33     5 Cindy
34 A34     9 Cindy
35 A35     0  Etsy
36 A36     1  Etsy
37 A37     1  Etsy
38 A38     2  Etsy
39 A39     2  Etsy
40 A40     2  Etsy
41 A41     3  Etsy
42 A42     3  Etsy
43 A43     3  Etsy
44 A44     3  Etsy
1   A1     0  John
2   A2     0  John
3   A3     0  John
4   A4     1  John
5   A5     2  John
6   A6     3  John
7   A7     3  John
8   A8     4  John
9   A9     4  John
10 A10     7  John
11 A11    10  John
12 A12    14  John

我想要的是确定每个组的中间pid。因此,例如Cindy,它将在A28左右,因为有13排,天花板(13/2(是7。我尝试将dplyr与n((一起使用,但这会重置行。

此操作失败,因为它没有重置行号

df %>% group_by( group )  %>%
dplyr::summarise  (
median = median ( total),
mid.pid = df[ceiling ( n()/2 ), ]$pid
)

基于ceiling索引对原始数据集进行子集设置将破坏分组。我们只需要使用没有任何$[pid,因为这些pid是每个组中"pid"的元素

library(dplyr)
df %>% 
group_by(group)  %>%
dplyr::summarise(
median = median(total),
mid.pid = pid[ceiling(n()/2)], .groups = 'drop')

-输出

# A tibble: 4 x 3
#  group median mid.pid
#* <chr>  <dbl> <fct>  
#1 Amy        2 A17    
#2 Cindy      1 A28    
#3 Etsy       2 A39    
#4 John       3 A6     

您可以尝试:

data.frame('name' = unique(df[,'group']), 'pid' = 'NA') -> output
for(name in unique(df[,'group'])){
df[ceiling(nrow(df[df[,'group'] == name, ])/2)), 'pid'] -> output[name, 'pid']
}

这将创建一个包含名称和pid值的数据帧,pid值是该名称在数据帧中的次数的一半的上限。

最新更新