3

Я пытаюсь добавить новый столбец в кадр данных на основе нескольких условий из других столбцов. У меня есть следующие данные:Как создать новый столбец на основе нескольких условий из нескольких столбцов?

> commute <- c("walk", "bike", "subway", "drive", "ferry", "walk", "bike", "subway", "drive", "ferry", "walk", "bike", "subway", "drive", "ferry") 
> kids <- c("Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "Yes", "Yes", "No", "No", "Yes", "No", "Yes") 
> distance <- c(1, 12, 5, 25, 7, 2, "", 8, 19, 7, "", 4, 16, 12, 7) 
> 
> df = data.frame(commute, kids, distance) 
> df 
    commute kids distance 
1  walk Yes  1 
2  bike Yes  12 
3 subway No  5 
4 drive No  25 
5 ferry Yes  7 
6  walk Yes  2 
7  bike No   
8 subway No  8 
9 drive Yes  19 
10 ferry Yes  7 
11 walk No   
12 bike No  4 
13 subway Yes  16 
14 drive No  12 
15 ferry Yes  7 

Если следующие три условия:

commute = walk OR bike OR subway OR ferry 
AND 
kids = Yes 
AND 
distance is less than 10 

Тогда я хотел бы новую колонку под названием get.flyer равным «Да». Окончательный кадр данных должен выглядеть следующим образом:

commute kids distance get.flyer 
1  walk Yes  1  Yes 
2  bike Yes  12  Yes 
3 subway No  5   
4 drive No  25   
5 ferry Yes  7  Yes 
6  walk Yes  2  Yes 
7  bike No     
8 subway No  8   
9 drive Yes  19   
10 ferry Yes  7  Yes 
11 walk No     
12 bike No  4   
13 subway Yes  16  Yes 
14 drive No  12   
15 ferry Yes  7  Yes 
+0

Пожалуйста, попробуйте следовать [это] (http://stackoverflow.com/questions/5963269/как в изготовлении, а пра-р-воспроизводимая-пример/38523589 # 38523589) – user2100721

ответ

6

Мы можем использовать %in% для сравнения нескольких элементов в столбце, &, чтобы проверить, если оба условия истинны.

library(dplyr) 
df %>% 
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
      as.character(kids) == "Yes" & 
      as.numeric(as.character(distance)) < 10)+1]) 

Лучше создать data.frame с stringsAsFactors=FALSE как по умолчанию он TRUE. Если мы проверим str(df), мы можем обнаружить, что все столбцы имеют класс factor. Кроме того, если отсутствуют значения, вместо "", NA можно использовать, чтобы избежать преобразования class столбца numeric в нечто другое.

Если мы перепишем создание 'ДФ'

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7) 
df1 <- data.frame(commute, kids, distance, stringsAsFactors=FALSE) 

приведенный выше код может быть упрощены

df1 %>% 
    mutate(get.flyer = c("", "Yes")[(commute %in% c("walk", "bike", "subway", "ferry") & 
     kids == "Yes" & 
     distance < 10)+1]) 

Для лучшего понимания, некоторые люди предпочитают ifelse

df1 %>% 
    mutate(get.flyer = ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
       kids == "Yes" & 
       distance < 10, 
          "Yes", "")) 

Это может также легко сделать с помощью методов base R

df1$get.flyer <- with(df1, ifelse(commute %in% c("walk", "bike", "subway", "ferry") & 
       kids == "Yes" & 
       distance < 10, 
         "Yes", "")) 
6

Решение уже указано @akrun. Я хотел бы представить его более «обернутым» способом.

Вы можете использовать оператор ifelse для создания столбца, основанного на одном (или более) условиях. Но сначала вам нужно изменить «кодировку» отсутствующих значений в столбце расстояния. Вы использовали "" для указания отсутствующего значения, однако он преобразует весь столбец в string и блокирует численное сравнение (distance < 10 невозможен).R способ указания отсутствующего значения NA, ваше определение столбца distance должно быть:

distance <- c(1, 12, 5, 25, 7, 2, NA, 8, 19, 7, NA, 4, 16, 12, 7) 

ifelse заявления будет выглядеть следующим образом:

df$get.flyer <- ifelse(
    ( 
     (df$commute %in% c("walk", "bike", "subway", "ferry")) & 
     (df$kids == "Yes")          & 
     (df$distance < 10) 
    ), 
    1, # if condition is met, put 1 
    0 # else put 0 
) 

Дополнительно: Рассмотрим процесс кодирования других столбцов иными словами:

  • Вы можете использовать TRUE и FALSE вместо «Да» и «Нет» для kids переменной
  • вы могли бы использовать factor для коммутируют