嗨,假设我有以下数据帧。
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值是该名称在数据帧中的次数的一半的上限。