簡體   English   中英

搜索多列 dplyr

[英]Search multiple columns dplyr

我的專欄是:

> 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"             

我正在嘗試在“Retake”列中創建一個虛擬變量,如果任何測驗成績(Quiz1 到 Quiz8)低於 80.00,則取 1,否則取 0。

我的第一個想法是我需要一個 ifelse 來檢查“Quiz1”到“Quiz8”列中的任何值是否 <80 並且在“Retake”列中如果行內有任何匹配則返回 1,如果不匹配則返回 0。 是這樣的:

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"  "-" 

我們可以使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM