L oop через столбцы и отфильтровать значения на основе квантилей для каждого столбца - PullRequest
1 голос
/ 29 января 2020

Начиная с фрейма данных, который состоит из разных сайтов и ряда статистических данных ...

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

Я хотел бы провести l oop через каждую статистику и вывести один фрейм данных, где только значения, которые присутствуют для каждого показателя, являются значениями, которые выше 75-го процентиля или ниже значения 25-го процентиля для этого столбца спецификаций c, который будет выглядеть примерно так ...

# 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

Но я изо всех сил пытаюсь сделать так, чтобы я мог автоматизировать / l oop через столбцы статистики и создать желаемый окончательный кадр данных со всеми столбцами. Буду признателен за любые идеи. Фактические файлы, с которыми я буду работать, имеют более 100 статистик, поэтому я действительно сосредоточен на том, чтобы максимально автоматизировать.

1 Ответ

1 голос
/ 29 января 2020

Вы можете просто использовать 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
...