遍历列并根据分位数为每一列过滤出值

问题描述 投票:0回答:1

[从一个包含不同站点和大量统计信息的数据框开始...

test_df <- data.frame(site = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J"), stat1 = c(0.44, 11, 0.45, 0, 5, 2, 2.3, 1.8, -3, 0), stat2 = c(10, 9, 10.1, 8, 7, 8.2, 8, 9.5, 9.6, 8), stat3 = c(0, 0.2, 0, 0.1, 0.15, 0.12, 1, -1, 0.15, 0.11))

# site  stat1  stat2  stat3  
#   A    0.44    10     0     
#   B    11      9     0.2    
#   C    0.45    10.1    0
#   D    0       8     0.1
#   E    5       7     0.15
#   F    2       8.2   0.12
#   G    2.3     8      1
#   H    1.8     9.5   -1
#   I    -3      9.6   0.15
#   J    0       8     0.11

我想遍历每个统计信息并输出一个数据框,其中每个统计信息唯一出现的值是该特定列的第75个百分位数或第25个百分位数以下的值。像这样...

# site  stat1  stat2  stat3  
#   A    NA      10     0     
#   B    11      NA     0.2    
#   C    NA      10.1   0
#   D    0       NA     NA
#   E    5       7      NA
#   F    NA      NA     0.12
#   G    2.3     NA     1
#   H    NA      NA     -1
#   I    -3      9.6    NA
#   J    0       NA     NA

到目前为止是我的方法...


# I know I can filter out values for one stat at a time by doing the following...

stat1_df <- test_df %>% filter(stat1 > quantile(stat1, 0.75) | (stat1 < quantile(stat1, 0.25))) %>% select(site, stat1)

stat1_df

#   site stat1
#   B   11.0
#   D   0.0
#   E   5.0
#   G   2.3
#   I   -3.0
#   J   0.0

但是我努力做到这一点,所以我可以自动/循环遍历stat列,并使用所有列创建所需的最终数据框。我将不胜感激。我将使用的实际文件具有100多个统计信息,因此我真的非常专注于自动化。

r for-loop dplyr quantile
1个回答
0
投票

您可以简单地使用lapply

test_df[-1] <- lapply(test_df[-1], function(x) {
  q <- quantile(x, prob=c(.25, .75))
  x[!(x < q[1] | x > q[2])] <- NA
  x
})
test_df
#    site stat1 stat2 stat3
# 1     A    NA  10.0   0.0
# 2     B  11.0    NA   0.2
# 3     C    NA  10.1   0.0
# 4     D   0.0    NA    NA
# 5     E   5.0   7.0    NA
# 6     F    NA    NA    NA
# 7     G   2.3    NA   1.0
# 8     H    NA    NA  -1.0
# 9     I  -3.0   9.6    NA
# 10    J   0.0    NA    NA
© www.soinside.com 2019 - 2024. All rights reserved.