我有一個這樣的資料框:
ID diagnosis A1 A2 A3
a yes A A B
b yes B C D
c no <NA> C <NA>
d no E C D
e yes D <NA> B
這里的 A1、A2 和 A3 指的是我測驗中的問題,下面的字母代表參與者給出的答案。我想要的是為每個問題創建新列,指示答案是否正確。如果是真的,我給1,如果不是0。對于某些問題,我有兩個正確的答案。所以這是我從 dplyr 使用的代碼和我得到的:
mydf <- mydf %>% mutate(A1.1 = if_else(A1 %in% c("A"), 1, 0))%>% mutate(A2.1 = if_else(A2 %in% c("A", "B"), 1, 0)) %>% mutate(A3.1 = if_else(A3 %in% c("A", "B"), 1, 0))
ID diagnosis A1 A2 A3 A1.1 A2.1 A3.1
a yes A A B 1 1 1
b yes B C D 0 0 0
c no <NA> C <NA> 0 0 0
d no E C D 0 0 0
e yes D <NA> B 0 0 1
如您所見,NA 值變為 0,但我想將它們保留為 NA。所以,我的第一個問題是如何保留 NA。
我的第二個問題是,您是否可以根據對其他專欄的回答想出更短的方法來制作這些專欄。因為在我的真實資料中我有 30 個問題 :)
太感謝了!
uj5u.com熱心網友回復:
%in%
回傳FALSE
有NAs
. 我們可以使用==
library(dplyr)
mydf %>%
mutate(A1.1 = (A1 == "A"), A2.1 = (A2 == "A"|A2 == "B"),
A3.1 = (A3 == "A"|A3 == "B") )
-輸出
ID diagnosis A1 A2 A3 A1.1 A2.1 A3.1
1 a yes A A B 1 1 1
2 b yes B C D 0 0 0
3 c no <NA> C <NA> NA 0 NA
4 d no E C D 0 0 0
5 e yes D <NA> B 0 NA 1
如果有多個列使用相同的比較,則使用across
回圈
mydf %>%
mutate(A1.1 = (A1 == "A"), across(A2:A3,
~ (.x == "A"|.x == "B"), .names = "{.col}.1"))
ID diagnosis A1 A2 A3 A1.1 A2.1 A3.1
1 a yes A A B 1 1 1
2 b yes B C D 0 0 0
3 c no <NA> C <NA> NA 0 NA
4 d no E C D 0 0 0
5 e yes D <NA> B 0 NA 1
資料
mydf <- structure(list(ID = c("a", "b", "c", "d", "e"), diagnosis = c("yes",
"yes", "no", "no", "yes"), A1 = c("A", "B", NA, "E", "D"), A2 = c("A",
"C", "C", "C", NA), A3 = c("B", "D", NA, "D", "B")),
class = "data.frame", row.names = c(NA,
-5L))
uj5u.com熱心網友回復:
我會按列進行:
mydf$A1.1 = ifelse(mydf$A1 == "A", 1, 0)
mydf$A2.1 = ifelse(mydf$A2 == "A" | mydf$A2 == "B", 1, 0)
如果回應為 NA,這將保留 NA。...
uj5u.com熱心網友回復:
我會將正確答案存盤在串列中,然后這樣做:
# list of correct answers
ans <- list(A1='A',
A2=c('A', 'B'),
A3=c('A', 'B'))
# check the answers
tmp <- sapply(names(ans), function(a)
as.numeric(ifelse(is.na(mydf[[a]]), NA, mydf[[a]] %in% ans[[a]])))
# change column names
colnames(tmp) <- paste0(colnames(tmp), '.1')
cbind(mydf, tmp)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506738.html
上一篇:如何不重復地撰寫這段代碼?