[从一个包含不同站点和大量统计信息的数据框开始...
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多个统计信息,因此我真的非常专注于自动化。
您可以简单地使用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