计算每个组 i 数据帧的分位数并分配 NA?

  • 本文关键字:分配 NA 数据帧 计算 r
  • 更新时间 :
  • 英文 :


我编了这个例子来解释我的问题:

df= structure(list(group = structure(c(1L, 1L, 2L, 2L, 10L, 10L
), .Label = c("Eve", "ba", "De", "De","Mi", "C", "O", "W", 
"as", "ras", "Cro", "ics"), class = "factor"), ds = c(8, 8, 
1, 4, 4, 6), em = c(1, 3, 8,2, 7, 3)), row.names = c(74567L, 
74568L, 74570L, 74576L, 74577L, 74578L), class = "data.frame")

我需要每个组将 em 和 ds 的所有值分配给 NA

> quantile 90 = NA
< quantile 10 = NA

这是一种使用 dplyr 和ifelse为每个组和每个数字变量执行此操作的方法。

每组只有几个样本使得很难解释分位数的整个概念,因此您获得的结果在很大程度上取决于您如何定义分位数。type参数允许您指定正在使用的定义。R 默认为type = 7

library(dplyr)
df %>% 
group_by(group) %>% 
mutate(ds = ifelse(ds > quantile(ds, .9) | ds < quantile(ds, .1), NA, ds),
em = ifelse(em > quantile(em, .9) | em < quantile(em, .1), NA, em))
#> # A tibble: 6 x 3
#> # Groups:   group [3]
#>   group    ds em   
#>   <fct> <dbl> <lgl>
#> 1 Eve       8 NA   
#> 2 Eve       8 NA   
#> 3 ba       NA NA   
#> 4 ba       NA NA   
#> 5 ras      NA NA   
#> 6 ras      NA NA   

但是,您可以根据您的定义更改此设置:

df %>% 
group_by(group) %>% 
mutate(ds = ifelse(ds > quantile(ds, .9, type = 1) | 
ds < quantile(ds, .1, type = 1), NA, ds),
em = ifelse(em > quantile(em, .9, type = 1) |
em < quantile(em, .1, type = 1), NA, em))
#> # A tibble: 6 x 3
#> # Groups:   group [3]
#>   group    ds    em
#>   <fct> <dbl> <dbl>
#> 1 Eve       8     1
#> 2 Eve       8     3
#> 3 ba        1     8
#> 4 ba        4     2
#> 5 ras       4     7
#> 6 ras       6     3

创建于 2020-05-17 由 reprex 软件包 (v0.3.0(

最新更新