В кадре данных R, кодированном ниже, я хотел бы заменить все моменты, когда B
появляется на b
.
junk <- data.frame(x <- rep(LETTERS[1:4], 3), y <- letters[1:12])
colnames(junk) <- c("nm", "val")
это обеспечивает:
nm val
1 A a
2 B b
3 C c
4 D d
5 A e
6 B f
7 C g
8 D h
9 A i
10 B j
11 C k
12 D l
Моя первая попытка состояла в том, чтобы использовать for
и if
заявление вроде так:
for(i in junk$nm) if(i %in% "B") junk$nm <- "b"
но, как я уверен, вы можете видеть, это заменяет ВСЕ значения junk$nm
с b
. Я понимаю, почему это происходит, но я не могу заставить его заменить только те случаи нежелательной почты $ nm, где было исходное значение B
.
ПРИМЕЧАНИЕ: мне удалось решить проблему с gsub
но в интересах изучения R я все еще хотел бы знать, как заставить мой оригинальный подход работать (если это возможно)
Ответы:
Проще преобразовать нм в символы, а затем внести изменения:
РЕДАКТИРОВАТЬ: И если вам действительно нужно поддерживать нм как факторы, добавьте это в конце:
источник
еще один полезный способ замены значений
источник
Короткий ответ:
Взгляните на Индексные векторы в R Introduction (если вы еще не читали).
РЕДАКТИРОВАТЬ. Как отмечено в комментариях, это решение работает для символьных векторов, поэтому не справляйтесь с вашими данными.
Для фактора лучше всего изменить уровень:
источник
c("B","C")
. Делатьjunk$nm[junk$nm == "B"]
- лучший способ.b
к коэффициенту nm. Версия diliop на самом деле лучше, если вы хотите работать с персонажами, а не с факторами. (Всегда думайте о типе ваших переменных в первую очередь!)%in%
и==
заключается вNA
обработке:c(1,2,NA)==1
дает,TRUE, FALSE, NA
ноc(1,2,NA) %in% 1
даетTRUE, FALSE, FALSE
. И да, я забыл проверить, работает ли это: /Поскольку данные, которые вы показываете, являются факторами, это немного усложняет ситуацию. Ответ @diliop решает проблему путем преобразования в
nm
символьную переменную. Чтобы вернуться к исходным факторам, необходим следующий шаг.Альтернативой является манипулирование уровнями действующего фактора.
Это довольно просто, и я часто забываю, что есть функция замены для
levels()
.Изменить: как отметил @Seth в комментариях, это можно сделать однострочным без потери ясности:
источник
levels()
. Как насчет одного лайнераjunk <- within(junk, levels(nm)[levels(nm)=="B"] <- "b")
?Самый простой способ сделать это одной командой - использовать
which
команду, а также не нужно преобразовывать множители в символы, выполнив следующие действия:источник
Вы создали факторную переменную,
nm
поэтому вам нужно либо избегать этого, либо добавить дополнительный уровень к атрибутам фактора. Вам также следует избегать использования<-
в аргументах data.frame ()Опция 1:
Вариант 2:
источник
data.frame
?b
как уровень, просто измените уровеньB
доb
.a <- data.frame(x<-1:10)
. Его имя столбца неx
а грязныйx....1.10
. Лучше использовать data.frame (x = 1:10). Тогда вы знаете, как называется ваш столбец.predict()
котором вы будете жаловаться, если уровни факторов в новых данных не совпадают с теми, которые используются для соответствия модели. Более чистый в долгосрочной перспективе, чтобы данные отформатированы так, как вы хотите, должным образом, чем полагаться на короткие пути. Я согласен, что было бы проще не делать это фактором, но если он уже есть, или должен быть одним из них для некоторых упражнений по моделированию ...Если вы работаете с символьными переменными (обратите внимание, что
stringsAsFactors
здесь неверно), вы можете использовать replace:источник
Вызовите эту функцию, используя строку ниже.
источник