【问题标题】:Piping and If statement with multiple outputs in RR中具有多个输出的管道和If语句
【发布时间】:2020-05-08 00:20:43
【问题描述】:

我在这里错过了什么......

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

【问题讨论】:

    标签: r dataframe if-statement pipe


    【解决方案1】:

    我们可以使用 ifelsecase_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'
    

    【讨论】:

    • 所以要评估两个案例,我会添加 %>% mutate(vote = case_when(age >=18 ~ "yes", TRUE ~"no"))
    • @seansteele 如果相同,则可以使用vote = drive(根据您的情况,两者相同)
    【解决方案2】:

    我们可以将 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在这里获取输出,但是会比上面的方法慢。

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 2015-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多