Как суффиксировать содержимое столбца в новый столбец, если третий столбец истинен R - PullRequest
0 голосов
/ 22 февраля 2019

Привет, у меня есть такой фрейм данных, как показано ниже:

beverage <- c('tea', 'tea', 'coffee', 'coffee', 'tea', 'tea', 'coffee', 'coffee')
milk <- c('FALSE', 'FALSE','FALSE', 'FALSE', 'TRUE', 'TRUE','TRUE', 'TRUE')

df1 <- data.frame(beverage, milk)
df1
     beverage        milk
1    tea             FALSE
2    tea             FALSE
3    coffee          FALSE
4    coffee          FALSE
5    tea             TRUE
6    tea             TRUE
7    coffee          TRUE
8    coffee          TRUE

Я хотел бы добавить еще один столбец beverage_milk, который бы содержал содержимое столбца с напитком, и добавить _milk, если указан столбец молокакак TRUE.Как это:

     beverage        milk     beverage_milk
1    tea             FALSE    tea
2    tea             FALSE    tea
3    coffee          FALSE    coffee
4    coffee          FALSE    coffee
5    tea             TRUE     tea_milk
6    tea             TRUE     tea_milk
7    coffee          TRUE     coffee_milk
8    coffee          TRUE     coffee_milk

Я думал использовать что-то вроде:

beverage_milk = within(beverage_milk{
beverage_milk = ifelse(milk == TRUE, beverage(+_milk), beverage})

очевидно, я знаю (+ _milk) не будет работать, но этот подход в настоящее время не работает дляя, любая помощь высоко ценится.

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Используя dplyr, вы можете получить решение следующим образом:

library(dplyr)
beverage <- c('tea', 'tea', 'coffee', 'coffee', 'tea', 'tea', 'coffee', 'coffee')
milk <- c('FALSE', 'FALSE','FALSE', 'FALSE', 'TRUE', 'TRUE','TRUE', 'TRUE')
df1 <- data.frame(beverage, milk)

df1 %>% 
  mutate(beverage_milk = ifelse(milk == 'TRUE', paste0(beverage, "_milk"), paste(beverage)))

#  beverage  milk beverage_milk
#1      tea FALSE           tea
#2      tea FALSE           tea
#3   coffee FALSE        coffee
#4   coffee FALSE        coffee
#5      tea  TRUE      tea_milk
#6      tea  TRUE      tea_milk
#7   coffee  TRUE   coffee_milk
#8   coffee  TRUE   coffee_milk
0 голосов
/ 22 февраля 2019

Опция replace (немного быстрее, чем ifelse)

df1$milk <- as.logical(df1$milk)
df1$beverage_milk <- with(df1, replace(beverage, milk, paste(beverage, "milk", sep = "_")))
df1
#  beverage  milk beverage_milk
#1      tea FALSE           tea
#2      tea FALSE           tea
#3   coffee FALSE        coffee
#4   coffee FALSE        coffee
#5      tea  TRUE      tea_milk
#6      tea  TRUE      tea_milk
#7   coffee  TRUE   coffee_milk
#8   coffee  TRUE   coffee_milk

Синтаксис для ifelse может быть

df1$beverage_milk <- with(df1, ifelse(milk, paste(beverage, "milk", sep = "_"), beverage)) 

данные

beverage <- c('tea', 'tea', 'coffee', 'coffee', 'tea', 'tea', 'coffee', 'coffee')
milk <- c('FALSE', 'FALSE','FALSE', 'FALSE', 'TRUE', 'TRUE','TRUE', 'TRUE')

df1 <- data.frame(beverage, milk, stringsAsFactors = FALSE)
0 голосов
/ 22 февраля 2019

Вот вариант dplyr

library(dplyr)
df1 %>%
    mutate_if(is.factor, as.character) %>%
    mutate(beverage_milk = if_else(milk == TRUE, paste0(beverage, "_milk"), beverage))
#  beverage  milk beverage_milk
#1      tea FALSE           tea
#2      tea FALSE           tea
#3   coffee FALSE        coffee
#4   coffee FALSE        coffee
#5      tea  TRUE      tea_milk
#6      tea  TRUE      tea_milk
#7   coffee  TRUE   coffee_milk
#8   coffee  TRUE   coffee_milk

Или в базе R

transform(df1, beverage_milk = ifelse(
    milk == TRUE, paste0(beverage, "_milk"), as.character(beverage)))
#  beverage  milk beverage_milk
#1      tea FALSE           tea
#2      tea FALSE           tea
#3   coffee FALSE        coffee
#4   coffee FALSE        coffee
#5      tea  TRUE      tea_milk
#6      tea  TRUE      tea_milk
#7   coffee  TRUE   coffee_milk
#8   coffee  TRUE   coffee_milk

PS.Ваши данные образца не могут быть воспроизведены;beverage содержит дополнительный ошибочный элемент.

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