Конвейер и оператор If с несколькими выходами в R - PullRequest
1 голос
/ 08 мая 2020

Что мне здесь не хватает ...

df <- data.frame("sn" = 1:3, "age" = c(21,15, 18), "name" = c("John","Dora", "Lynn"))

df %>% if (df$age >= 18){
  df$drive <- "yes"
  df$vote <- "yes"
}

Error in if (.) df$age >= 18 else { : 
  argument is not interpretable as logical

... при попытке создать этот фрейм данных?

  sn age name drive vote
1  1  21 John   yes  yes
2  2  15 Dora    no   no
3  3  21 Lynn   yes  yes

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Мы могли бы использовать ifelse или case_when, поскольку они векторизованы, а if/else - нет, т.е. он ожидает вектор длины 1 как логический вектор

library(dplyr)
df %>%
     mutate(drive = case_when(age >=18 ~ "yes", TRUE ~"no"),
             vote = drive)

В base R мы можем сделать

df[c('drive', 'vote')] <- 'no'
df[df$agge >=18, c('drive', 'vote')] <- 'yes'
0 голосов
/ 08 мая 2020

Мы можем сравнить age с 18 и присвоить "yes", "no" значения на основе этого. Поскольку возраст для вождения и голосования одинаковый, мы можем использовать те же значения для vote.

df$drive <- c('no', 'yes')[(df$age >= 18) + 1]
df$vote <- df$drive
df

#  sn age name drive vote
#1  1  21 John   yes  yes
#2  2  15 Dora    no   no
#3  3  18 Lynn   yes  yes

Мы также можем использовать ifelse / if_else для вывода здесь, но это будет медленнее, чем описанный выше подход.

...