r - использовать dplyr для изменения столбца 2, если столбец 1 равен - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь использовать dplyr для изменения (или mutate_if?) Column2 кадра данных на основе содержимого столбца 1.

ID    TEST    PREF
11    true    blue
23    false   red
4     false   yellow

Если test == "false", я хочу изменить PREF= "апельсин".В противном случае не изменяйте PREF.

ID    TEST    PREF
11    true    blue
23    false   orange
4     false   orange

Я думал, что ifelse-заявление может сработать, но не могу понять, как заставить другие ничего не делать.Кажется, он возвращает номер столбца вместо содержимого в этой строке.

df <- data.frame(ID = c("11", "23", "4"),
                 TEST = factor(c("true", "false", "false")),
                 PREF = factor(c("blue", "red", "yellow")))

df <- df %>%
  mutate(PREF = ifelse(TEST == "false", "orange", PREF))

Мне кажется, что mutate_if должен быть уместным, но я не думаю, что хорошо понимаю его функцию и не могу найти какой-либопримеры похожие на то, что мне нужно.Что-то вроде:

df <- df %>%
  mutate_if(TEST == "true", PREF = "orange")

Может кто-нибудь дать мне несколько советов?Спасибо!

Редактировать:

Я понял, что в моем утверждении ifelse оно возвращало уровень фактора, а не символы, которые я хотел.Это работает именно так, как я и надеялся, указав as.character.

df2 <- df %>%
  mutate(PREF = factor(ifelse(TEST == "false", "white", as.character(PREF))))

1 Ответ

1 голос
/ 11 июня 2019

Вы на это! Но вы должны убедиться, что столбцы вашего персонажа не преобразованы в факторы. Я не до конца понимаю, почему if_else () завершается неудачно с факторными уровнями, но по крайней мере этот адаптированный код ниже делает то, что я думаю, вы хотите. stringsAsFactors важны как никогда.

library(dplyr)

df <- data.frame(ID = c("11", "23", "4"),
                 myTEST = c("true", "false", "false"),
                 myPREF = c("blue", "red", "yellow"), stringsAsFactors=F)

new_df <- df %>%
  mutate(myPREF = case_when(myTEST=="false" ~ "orange",
                          TRUE ~ myPREF))

str(new_df)

mutate_if имеет заманчивое имя, но предикат работает AFAIK только для столбцов, а не для строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...