想象一下,对于几十个主题的收集问卷,我想检查每个问题的答案是否正确。为了实现这种按列操作,我使用了mapply
函数,其中向量化对分别是列(多个变量)和向量(多个元素),详情请参见下面的演示代码。但是,使用这种方法,我需要手动生成变量以将其合并到原始数据框中,因此,我想知道是否有另一种方法可以使用 mutate 的多变量版本实现类似的效果
dplyr 包中的函数?因此无需手动生成变量名称并以矢量化方式实现。
##simulated data generation with four questions
IDs<-paste0('subj',0,1:7)
Q1<-c('A','B','C','A','A','A','D')
Q2<-c('A','B','B','B','B','D','C')
Q3<-c('B','B','C','C','C','D','C')
Q4<-c('A','D','D','B','D','D','C')
vect<-data.frame(cbind(IDs,Q1,Q2,Q3,Q4))
##answer for the four questions
answer<-c('A','B','C','D')
##method with mapply function
myfunc<-function(vec,value) {
ifelse(vec==value, TRUE, FALSE)
}
newvariable<-mapply(myfunc, vect[,2:5], answer)
colnames(newvariable)<-paste0('Q',1:4,"_ans")
newvariable
vect_new1<-cbind(vect,newvariable)
vect_new1
最佳答案
使用 apply
的基本方法:
cbind(vect, `colnames<-`(t(apply(vect[-1], 1, `==`, answer)), paste0("Q", 1:4, "_Ans")))
或者使用map2
:
library(tidyverse)
vect %>%
select(-IDs) %>%
map2_dfc(answer, `==`) %>%
set_names(~ str_c(., "_Ans")) %>%
bind_cols(vect, .)
或者
vect %>%
pivot_longer(Q1:Q4) %>%
mutate(Ans = value == answer) %>%
pivot_wider(values_from = c(value, Ans))
输出
# IDs Q1 Q2 Q3 Q4 Q1_Ans Q2_Ans Q3_Ans Q4_Ans
# 1 subj01 A A B A TRUE FALSE FALSE FALSE
# 2 subj02 B B B D FALSE TRUE FALSE TRUE
# 3 subj03 C B C D FALSE TRUE TRUE TRUE
# 4 subj04 A B C B TRUE TRUE TRUE FALSE
# 5 subj05 A B C D TRUE TRUE TRUE TRUE
# 6 subj06 A D D D TRUE FALSE FALSE TRUE
# 7 subj07 D C C C FALSE FALSE TRUE FALSE
关于r - 用 `dplyr`生成多列变量,向量化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60916841/