【发布时间】:2018-04-14 04:04:20
【问题描述】:
library(tidyverse)
使用示例数据(底部),我正在尝试类似下面的代码,但我不知道如何使用 map2 中的 dplyr::select 函数按名称选择列的策略。这个特定的例子使用了正则表达式,但我想要一种方法,它也可以使用 dplyr::select 中的“contains”、“ends_with”或“starts_with”。
我意识到我可以在下面使用索引...这很有效...
map2(Df[8:12],Df[3:7],~ if_else(.x != 3, recode(.y,`1`=0,`2`=0,`3`=0,`4`=1,`5`=1),88)) %>%
as.data.frame %>%
rename_all(paste0,"_new") %>%
cbind(Df,.)
但由于我的真实数据集有很多列名,我只想使用“选择”函数来命名它们,或者使用正则表达式。我已经尝试过以下代码的变体,但似乎都不起作用。我该如何纠正?
下面的代码首先是子集,因为我只想要我正在使用的变量,然后通过管道进入 map2。
Df<-Df%>%select(Code,Pet,matches("^q.*s$"),matches("^q.*i$"))%>%
map2(Df(matches("^q.*i$")), Df(matches("^q.*s$")), ~ if_else(.x != 1,
recode(.y,`1`=0,`2`=0,`3`=0,`4`=1,`5`=1),88)) %>%
as.data.frame %>%
rename_all(paste0,"_new") %>%
cbind(Df,.)
示例数据:
q25i<-c(2,1,88,2,1,2,2,2)
q26i<-c(2,88,88,88,2,2,2,1)
q27i<-c(2,2,1,1,1,1,1,2)
q28i<-c(88,1,1,2,2,2,2,88)
q29i<-c(1,1,1,2,2,1,88,2)
q25s<-c(3,5,88,4,1,4,4,5)
q26s<-c(4,4,5,5,1,4,4,3)
q27s<-c(3,3,4,1,4,5,5,3)
q28s<-c(4,5,88,1,3,2,2,2)
q29s<-c(88,88,3,4,4,3,3,2)
q25U<-c(2,4,4,4,4,4,5,4)
q26U<-c(5,4,6,5,4,3,6,7)
q27U<-c(4,3,2,3,3,3,2,1)
q28U<-c(4,3,2,3,3,2,3,1)
q29U<-c(4,3,5,5,4,3,3,2)
Code<-c("P1","AB","AB","P1","P1","CD","AAA","CD")
Pet<-c("Dog","Cat","Dog","Fish","Dog","Cat","Rabbit","Fish")
Df<-data.frame (Code,Pet,q25U,q26U,q27U,q28U,q29U,q25i,q26i,q27i,q28i,q29i,q25s,q26s,q27s,q28s,q29s)
【问题讨论】:
-
如果你能提供一个最小的工作示例数据会有所帮助
-
我扩展了...这行得通吗?