[英]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.