Компактный код для условной замены значений с условием «ИЛИ» - PullRequest
0 голосов
/ 05 мая 2020

У меня очень длинный набор данных и относительно короткий список значений идентификаторов, для которых мои данные неверны. Следующие действия работают, но мой вектор invalid_IDs на самом деле намного больше:

wrong_IDs <- c('A1', 'B3', 'B7', 'Z31')
df$var1[df$var2 == 'A1' | df$var2 == 'B3' | df$var2 == 'B7' | df$var2 == 'Z31'] <- 0L

Это выглядит очень просто c, но я не нашел компактного способа записать это. Спасибо за любую помощь

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Вот очень компактное решение с использованием grepl и регулярного выражения:

Некоторые иллюстративные данные:

set.seed(123)
df <- data.frame(
  ID = paste0(rep(LETTERS[1:3], 2), sample(1:3, 6, replace = T)),
  Var2 = rnorm(6),
  stringsAsFactors = F)
df

wrong_IDs <- c('A1', 'B3', 'B1', 'C3')

Чтобы установить в 0 те строки, которые содержат wrong_IDs, вы можете свернуть их значения в одну строку, разделенную только оператором чередования регулярных выражений |, и указание grepl сопоставить эти альтернативные шаблоны в df$ID:

df$ID <- ifelse(grepl(paste0(wrong_IDs, collapse = "|"), df$ID), 0, df$ID)
df
  ID        Var2
1  0  0.07050839
2  0  0.12928774
3 C2  1.71506499
4 A3  0.46091621
5  0 -1.26506123
6 C1 -0.68685285
1 голос
/ 05 мая 2020

Вы можете сравнить свои данные с неправильными_идентификаторами с помощью оператора% in%

df <- data.frame("var1" = 101:120, "var2" = c(1:20))
wrong_ids <- c(3, 5, 7)
df$var1[df$var2 %in% wrong_ids] <- 0

, где df $ var2% в% error_ids предоставляет вам логический вектор ИСТИНА / ЛОЖЬ, который применяет только "установленный в ноль" "операция для выбранных строк (здесь строки 3, 5 и 7).

...