Я пытаюсь достичь чего-то похожего на этот вопрос, но с несколькими значениями, которые должны быть заменены на NA и в большом наборе данных.
df <- data.frame(name = rep(letters[1:3], each = 3), foo=rep(1:9),var1 = rep(1:9), var2 = rep(3:5, each = 3))
который генерирует этот блок данных:
df
name foo var1 var2
1 a 1 1 3
2 a 2 2 3
3 a 3 3 3
4 b 4 4 4
5 b 5 5 4
6 b 6 6 4
7 c 7 7 5
8 c 8 8 5
9 c 9 9 5
Я хотел бы заменить все вхождения, скажем, 3 и 4 на NA, но только в столбцах, начинающихся с "var".
Я знаю, что для достижения желаемого результата я могу использовать комбинацию операторов []
:
df[,grep("^var[:alnum:]?",colnames(df))][
df[,grep("^var[:alnum:]?",colnames(df))] == 3 |
df[,grep("^var[:alnum:]?",colnames(df))] == 4
] <- NA
df
name foo var1 var2
1 a 1 1 NA
2 a 2 2 NA
3 a 3 NA NA
4 b 4 NA NA
5 b 5 5 NA
6 b 6 6 NA
7 c 7 7 5
8 c 8 8 5
9 c 9 9 5
Теперь мои вопросы таковы:
- Есть ли способ сделать это эффективным образом, учитывая, что мои фактические набор данных имеет около 100 000 строк, а 400 из 500 переменных начинаются с "var". Кажется (субъективно) медленным на моем компьютере, когда я использую метод двойных скобок.
- Как я могу подойти к проблеме, если
вместо 2 значений (3 и 4), которые должны быть заменены NA, у меня был длинный
список, скажем, 100 различных значений? Есть ли способ указать несколько значений с необходимостью выполнять неуклюжую последовательность условий, разделенных оператором
|
?