Как переписать переменную в R на основе grep - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть простой фрейм данных:

> var_body_part <- c("eye and nose", "eye", "eye and ear", "eye and mouth", "foot", "foot", "ear", "ear", "foot", "mouth")

> var2 <- c("bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla", "bla")

> temp_df <- data.frame(var_body_part, var2)

Итак, мои данные:

> temp_df
   var_body_part var2
1   eye and nose  bla
2            eye  bla
3    eye and ear  bla
4  eye and mouth  bla
5           foot  bla
6           foot  bla
7            ear  bla
8            ear  bla
9           foot  bla
10         mouth  bla

Каждый раз, когда я нахожу «глаз», я хочу заменить строку на HEAD, т. Е. (см. первые 4 строки)

   var_body_part var2
1           HEAD  bla
2           HEAD  bla
3           HEAD  bla
4           HEAD  bla
5           foot  bla
6           foot  bla
7            ear  bla
8            ear  bla
9           foot  bla
10         mouth  bla

Это должно быть просто ... Я выбираю строки, на которые влияет преобразование, с помощью

temp_df$var_body_part[grep("eye", temp_df$var_body_part) ] 

, однако я не могу найти правильный оператор для заменыих с правильным значением "ГОЛОВА".

Пока с моими попытками я получаю много

invalid factor level, NA generated

Кто-нибудь может помочь?

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Проблема в том, что столбцы были преобразованы в factor при создании файла temp_df.Просто используйте stringsAsFactors = FALSE и все готово:

temp_df <- data.frame(var_body_part, var2, stringsAsFactors = FALSE)
temp_df$var_body_part[grep("eye", temp_df$var_body_part)] <- "HEAD"

Если вы хотите использовать факторы, вы можете добавить «ГОЛОВУ» к уровням var_body_part:

temp_df <- data.frame(var_body_part, var2, stringsAsFactors = TRUE)
levels(temp_df$var_body_part) <- c(levels(temp_df$var_body_part), "HEAD")
temp_df$var_body_part[grep("eye", temp_df$var_body_part)] <- "HEAD"
0 голосов
/ 17 декабря 2018

Это довольно просто, используя gsub():

mutate_at(temp_df, 'var_body_part', funs(gsub('.*eye.*', 'HEAD', .)))
0 голосов
/ 16 декабря 2018

Вы можете использовать transform вместе с sub:

transform(temp_df, var_body_part = sub(".*eye.*", "HEAD", var_body_part))

Результат:

   var_body_part var2
1           HEAD  bla
2           HEAD  bla
3           HEAD  bla
4           HEAD  bla
5           foot  bla
6           foot  bla
7            ear  bla
8            ear  bla
9           foot  bla
10         mouth  bla
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...