【问题标题】:Search multiple columns dplyr搜索多列 dplyr
【发布时间】:2021-10-07 21:08:58
【问题描述】:

我的专栏是:

> names(fullmerge.df)
 [1] "Email"               "SID"                 "First.Name"          "Last.Name"          
 [5] "Program"             "Location"            "StudentType"         "SS.Advisor"         
 [9] "CourseTotal"         "Questionnaire"       "Quiz1"               "Quiz2"              
[13] "Quiz3"               "Quiz4"               "Quiz5"               "Quiz6"              
[17] "Quiz7"               "Quiz8"               "Satisfaction.Survey" "F1"                 
[21] "Status"              "Incomplete"          "Retake"             

我正在尝试在“重考”列中创建一个虚拟变量,如果任何测验成绩(Quiz1 到 Quiz8)低于 80.00,则为 1,否则为 0。

我的第一个想法是我需要一个 ifelse 来检查“Quiz1”到“Quiz8”列中的任何值是否

fullmerge.df$Retake <- ifelse(fullmerge.df$Quiz1 <80 |
                                  fullmerge.df$Quiz2 <80 |
                                  fullmerge.df$Quiz3 <80 |
                                  fullmerge.df$Quiz4 <80 |
                                  fullmerge.df$Quiz5 <80 |
                                  fullmerge.df$Quiz6 <80 |
                                  fullmerge.df$Quiz7 <80 |
                                  fullmerge.df$Quiz8 <80
                                , 1 , 0)

我也知道:

starts_with.("Quiz")

...只是不知道如何实现。

话虽如此,另一个问题是所有“Quizx”列都是 chr。键入,因为如果测验尚未完成,它们包含字符串“-”。 “Quiz4”列还包含字符串“Not required”,因为有些学生不需要参加此测验。

> unique(fullmerge.df$Quiz4)
[1] "Not required" "80.00"   "100.00"  "-" 

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用if_any

    library(dplyr)
    fullmerge.df <- fullmerge.df %>%
         mutate(Retake = +(if_any(starts_with("Quiz"), ~ as.numeric(.) < 80)))
    

    或者base R 中的一个选项是

    nm1 <- grep("^Quiz", names(fullmerge.df))
    tmp <- fullmerge.df[nm1]
    tmp[] <- lapply(tmp, as.numeric)
    fullmerge.df$Retake <- +(rowSums(tmp < 80, na.rm = TRUE) > 0)
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 2012-03-16
      • 2012-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多