короткое ifelse для заданного варианта использования c, установите векторные элементы в NA - PullRequest
0 голосов
/ 18 января 2020

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

Допустим, я хочу очистить значение X, которое, как я знаю, не может превышать 100 в реальном мире. ситуации, поэтому я просто хочу превратить все значения выше 100 в значения NA, которые не будут включены в анализ.

Поэтому я бы сделал: сохраняет остальные

Это кажется довольно громоздким и делает код нечитаемым, когда я использую реальные имена переменных, которые довольно длинные.

Есть ли более короткий способ сделать то, что я пытаюсь выполнить ?

Спасибо!

Есть ли способ в r сократить этот горох

Ответы [ 4 ]

4 голосов
/ 18 января 2020

Самый простой способ, о котором я знаю, это функция is.na<-.

is.na(df$x) <- df$x > 100

Объяснение.

Функция is.na<- является обобщенной c функция, определенная в файле
src/library/base/R/is.R как

`is.na<-` <- function(x, value) UseMethod("is.na<-")

В файле определен один метод, метод по умолчанию.

`is.na<-.default` <- function(x, value)
{
    x[value] <- NA
    x
}

Это то, что механизм диспетчеризации методов S3 вызывает в строка кода ответа. Альтернативный способ назвать это функциональной формой.

`is.na<-`(df$x, df$x > 100)
1 голос
/ 18 января 2020

Использовать data.table

setDT(df) df[x > 100, x := NA]

Если операция применяется для нескольких столбцов,

column.names <- names(df)[names(df) %in% column.names] for(i.col in column.names){ set(df, which(df[[i.col]] > 100), i.col, NA) }

0 голосов
/ 18 января 2020

Тогда вы можете использовать индекс столбца вместо имен столбцов.

col <- which(names(df) == 'x')
df[[col]] <- df[[col]] * c(1, NA)[(df[[col]]  > 100) + 1]

Или

df[[col]] <- with(df, replace(df[[col]], df[[col]] > 100, NA))

Так что здесь вы используете имя столбца только один раз.

0 голосов
/ 18 января 2020

Попробуйте Этот ответ поможет.

df <- data.frame('X'=c(1,2,3,4,NA,100,101,102))

df$X <- as.numeric(df$X)

df$X <- ifelse((is.na(df$X) | df$X >100),NA,df$X)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...