Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按分组选择顶部的数据框_R_Dataframe_Dplyr_Grouping - Fatal编程技术网

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