Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以矢量化的方式生成具有'dplyr'和函数的多列变量_R_Dplyr_Mutate - Fatal编程技术网

以矢量化的方式生成具有'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