Как условно заменить значения NA на несколько столбцов - PullRequest
1 голос
/ 18 апреля 2019

Я хотел бы заменить выбросы в каждом столбце данных на NA.

Если, например, мы определяем выбросы как любое значение, превышающее 3 стандартных отклонения от среднего, я могу достичь этого для переменной с помощью приведенного ниже кода.

Вместо того, чтобы указывать каждый столбец отдельно, я бы хотел выполнить одну и ту же операцию для всех столбцов df за один вызов. Любые указатели о том, как это сделать ?!

Спасибо!

library(dplyr)
data("iris")
df <- iris %>% 
  select(Sepal.Length, Sepal.Width, Petal.Length)%>% 
  head(10) 

# add a clear outlier to each variable
df[1, 1:3] = 99

# replace values above 3 SD's with NA
df_cleaned <- df %>% 
  mutate(Sepal.Length = replace(Sepal.Length, Sepal.Length > (abs(3 * sd(df$Sepal.Length, na.rm = TRUE))), NA))

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Вам нужно использовать mutate_all(), т.е.

library(dplyr)

df %>% 
 mutate_all(funs(replace(., . > (abs(3 * sd(., na.rm = TRUE))), NA)))
1 голос
/ 18 апреля 2019

Другой вариант - base R

df[] <- lapply(df, function(x) replace(x, . > (abs(3 * sd(x, na.rm = TRUE))), NA))

или colSds из matrixStats

library(matrixStats)
df[df > abs(3 * colSds(as.matrix(df), na.rm = TRUE))] <- NA
...