以矢量化的方式生成具有'dplyr'和函数的多列变量
想象一下,对于收集的几十个主题的问卷,我想检查每个问题的答案是否正确。为了实现这种逐列操作,我使用以矢量化的方式生成具有'dplyr'和函数的多列变量,r,dplyr,mutate,R,Dplyr,Mutate,想象一下,对于收集的几十个主题的问卷,我想检查每个问题的答案是否正确。为了实现这种逐列操作,我使用mapply函数,其中向量化对分别是列(多变量)和向量(多元素),详细信息请参见下面的演示代码。但是,使用这种方法时,我需要手动生成变量以将其合并到原始数据帧中,因此,我想知道是否有其他方法可以使用dplyr包中的多元版本的mutate函数实现类似效果?因此,不需要手动生成变量的名称并以矢量化的方式实现它 ##simulated data generation with four questions
mapply
函数,其中向量化对分别是列(多变量)和向量(多元素),详细信息请参见下面的演示代码。但是,使用这种方法时,我需要手动生成变量以将其合并到原始数据帧中,因此,我想知道是否有其他方法可以使用dplyr包中的多元版本的mutate
函数实现类似效果?因此,不需要手动生成变量的名称并以矢量化的方式实现它
##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
##模拟数据生成与四个问题
IDs一个选项可以是:
bind_cols(vect, vect %>%
do(data.frame(sweep(select(., -1), 2, FUN = `==`, c("A", "B", "C", "D")))) %>%
rename_all(~ paste0(., "_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
使用应用的基本方法:
cbind(vect, `colnames<-`(t(apply(vect[-1], 1, `==`, answer)), paste0("Q", 1:4, "_Ans")))
或
输出
你的问题与标准评估有关。这对于dplyr
()来说可能相当棘手
使用dplyr
将非常困难,因为它不太适合字符串中的列名。使用data.table
首先,将对象转换为data.table
库(data.table)
data.table::setDT(vect)
然后,您只需要迭代您的答案向量(假设它们顺序正确!),并使用数据。表条件替换为:=
输出
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