[英]Using case_when inside mutate across
我有這樣的調查數據。 唯一的回答是“NA”或“Yes”。
data_in <-read_table2("ID Q26_1_1 Q26_1_2 Q26_1_3 Q26_1_4
1 NA NA NA Yes
2 NA NA NA NA
3 Yes Yes Yes NA
4 NA Yes Yes NA
5 NA NA NA NA
")
我必須對數據應用以下邏輯:
我能夠執行第一個和第三個邏輯,但我正在努力執行第二個邏輯:
這是我到目前為止的地方:
attempt <- data_in %>% mutate(across(matches("^Q26_1_1$|Q26_1_2$|Q26_1_3$"),.fns=~case_when(Q26_1_4=="Yes"~"No",
TRUE~as.character(.))))
這就是我希望我的數據的樣子:
data_out <- read_table2("ID Q26_1_1 Q26_1_2 Q26_1_3 Q26_1_4
1 No No No Yes
2 NA NA NA NA
3 Yes Yes Yes No
4 No Yes Yes No
5 NA NA NA NA
")
非常感謝任何建議! 我想我可能必須使用循環,但我不知道如何使用。 如果我轉換為數字並對所有 4 列求和,我可以使用類似..?
for (i in data_in){
if (is.na(i) & data_in[5]>0) {
i=="No"
}
}
我們可以使用輔助列來做到這一點。 (當然,您可以... select(-any_yes)
最后進行清理。)
data_in %>%
mutate(
# Logic 1
across(matches("^Q26_1_[1-3]$"),
~case_when(Q26_1_4 == "Yes" ~ "No", TRUE ~ .)
),
# Logic 2
any_yes = rowSums(select(., matches("^Q26_1_[1-3]$")) == "Yes", na.rm = TRUE) >= 1,
across(matches("^Q26_1_[0-9]$"),
~ case_when(
any_yes ~ coalesce(., "No"), # logic 2
TRUE ~ . # logic 3
)
))
# # A tibble: 5 x 6
# ID Q26_1_1 Q26_1_2 Q26_1_3 Q26_1_4 any_yes
# <dbl> <chr> <chr> <chr> <chr> <lgl>
# 1 1 No No No Yes FALSE
# 2 2 NA NA NA NA FALSE
# 3 3 Yes Yes Yes No TRUE
# 4 4 No Yes Yes No TRUE
# 5 5 NA NA NA NA FALSE
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.