r - 用 `dplyr`生成多列变量,向量化函数

标签 r dplyr

想象一下,对于几十个主题的收集问卷,我想检查每个问题的答案是否正确。为了实现这种按列操作,我使用了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/

相关文章:

r - 用 block 绘图

r - rpart "Error in as.character(x) : cannot coerce type ' builtin' to vector of type 'character' "消息是什么意思?

r - 更改数据帧结构(两个数据帧到一个)

r - 使用管道执行多个函数

r - 对从 Rscript.exe 调用的 R 脚本进行故障排除

r - 在 R 包 fPortfolio 中设置目标风险

R,dplyr : assign number of occurence as value to column at several group_by() levels

以表达式作为 dplyr 参数的 R 函数总结

重新编码和折叠多个二进制编码的列

r - 在 R 中提取模式周围的行