Заменить значение существующего столбца в зависимости от того, присутствует ли он в списке
У меня есть пример фрейма данных как таковой:
dat <- data.frame(V1 = c("Non Debt Balance","Non Debt Income","Non Debt Cost"),
V2 = c("Average Balance","Income","Cost"),
V3 = c("Trade","Sales Finance","Trade"))
Я хотел бы создать новый столбец на основе значения столбца V2. Если столбец V2 равен% в% ("Доход","Стоимость"), то я бы хотел, чтобы новый столбец выбрал столбец V3, если его нет в списке, то V2.
Я думал об использовании функции%in%, но не уверен, как мне поступить, если в этом списке if получит этот столбец, иначе получит логику этого столбца.
Помощь очень ценится. С Уважением,
3 ответа
Решение
Это то, что вы ищете?
library(dplyr)
dat %>%
mutate(V4 = case_when(V2 == "Income" | V2 == "Cost" ~ V3,
TRUE ~ V2))
V1 V2 V3 V4
1 Non Debt Balance Average Balance Trade Average Balance
2 Non Debt Income Income Sales Finance Sales Finance
3 Non Debt Cost Cost Trade Trade
В качестве альтернативы, используя %in%
как вы упомянули:
dat %>%
mutate(V4 = case_when(V2 %in% c("Cost", "Income") ~ V3,
TRUE ~ V2))
Данные:
dat <- data.frame(V1 = c("Non Debt Balance","Non Debt Income","Non Debt Cost"),
V2 = c("Average Balance","Income","Cost"),
V3 = c("Trade","Sales Finance","Trade"),
stringsAsFactors = FALSE)
dat$NewCol <- ifelse(dat$V2 %in% c('Income','Cost'), dat$V3, dat$V2)
- Вы также можете использовать dplyr/data.table
ifelse
не имеет лучшей производительности. Также вы не можете выполнять сравнения с учетом NA (т. Е. Трехсторонний выбор с предложением NA)
data.table путь:
result <- setDT(dat)[,result_col:= ifelse(V2 %in% c('Income','Cost'), V3, V2)]
> result
V1 V2 V3 result_col
1 Non Debt Balance Average Balance Trade Average Balance
2 Non Debt Income Income Sales Finance Sales Finance
3 Non Debt Cost Cost Trade Trade