R 按分组选择顶部的数据框
我有一个数据框,例如:R 按分组选择顶部的数据框,r,dataframe,dplyr,grouping,R,Dataframe,Dplyr,Grouping,我有一个数据框,例如: set.seed(1) df <- data.frame( sample = 1:50, value = runif(50), group = c(rep(NA, 20), gl(3, 10))) set.seed(1) df% 顶部(10,数值) 样本值组 1 46 0.7973088 3 2 49 0.8108702 3 3 22 0.8394404 1 42 0.8612095纳 5
set.seed(1)
df <- data.frame(
sample = 1:50,
value = runif(50),
group = c(rep(NA, 20), gl(3, 10)))
set.seed(1)
df%
顶部(10,数值)
样本值组
1 46 0.7973088 3
2 49 0.8108702 3
3 22 0.8394404 1
42 0.8612095纳
5 27 0.8643395 1
6200.8753213纳
7 44 0.8762692 3
8 26 0.8921983 1
911 0.9128759 NA
10 30 0.9606180 1
我希望在我的数据框中包括样本36、22、2、20、11和接下来的五个最高值,它们继续符合模式。我如何做到这一点?我想我已经明白了。这是最好的方式吗:
df_top <- df %>%
arrange(-value) %>%
group_by(group) %>%
filter(ifelse(!is.na(group), value == max(value), value == value)) %>%
ungroup() %>%
top_n(10, value)
# A tibble: 10 x 3
sample value group
<int> <dbl> <int>
1 18 0.992 NA
2 7 0.945 NA
3 21 0.935 1
4 4 0.908 NA
5 6 0.898 NA
6 35 0.827 2
7 41 0.821 3
8 20 0.777 NA
9 15 0.770 NA
10 17 0.718 NA
df_top%
排列(-value)%%>%
分组依据(分组)%>%
筛选器(如果其他(!is.na(组),值==max(值),值==value))%>%
解组()%>%
顶部(10,数值)
#一个tibble:10x3
样本值组
1180.992纳
270.945NA
3 21 0.935 1
4 0.908纳
560.898NA
6 35 0.827 2
7 41 0.821 3
820.777纳
9150.770纳
10170.718纳
使用切片
而不是过滤器的类似方法:
library(dplyr)
df_top <- df %>%
arrange(-value) %>%
group_by(group) %>%
slice(if(any(!is.na(group))) 1 else 1:n()) %>%
ungroup() %>%
top_n(10, value)
库(dplyr)
df_顶部%
排列(-value)%%>%
分组依据(分组)%>%
切片(如果(任何(!is.na(组)))1其他1:n())%>%
解组()%>%
顶部(10,数值)
结果:
# A tibble: 10 x 3
sample value group
<int> <dbl> <int>
1 21 0.9347052 1
2 35 0.8273733 2
3 41 0.8209463 3
4 18 0.9919061 NA
5 7 0.9446753 NA
6 4 0.9082078 NA
7 6 0.8983897 NA
8 20 0.7774452 NA
9 15 0.7698414 NA
10 17 0.7176185 NA
#一个tible:10 x 3
样本值组
1 21 0.9347052 1
2 35 0.8273733 2
3 41 0.8209463 3
4180.9919061 NA
570.9446753不适用
6.4 0.9082078纳
76 0.8983897 NA
8200.7774452纳
9150.7698414纳
10170.7176185纳
好的。如果你认为你自己的答案是最好的,你可以接受。事实上,我的答案适用于我的例子,但不适用于我的真实数据集;我还不知道为什么。那么,你能提供一个更好地反映真实数据的样本数据集吗?
# A tibble: 10 x 3
sample value group
<int> <dbl> <int>
1 21 0.9347052 1
2 35 0.8273733 2
3 41 0.8209463 3
4 18 0.9919061 NA
5 7 0.9446753 NA
6 4 0.9082078 NA
7 6 0.8983897 NA
8 20 0.7774452 NA
9 15 0.7698414 NA
10 17 0.7176185 NA