如何在管道中使用Dplyr::Select函数Purrr:map2all
使用示例数据(底部),我正在尝试下面的代码,但我一直坚持使用这种策略,即在map2中使用dplyr::select函数按名称选择列。这个特定的示例使用regex,但我希望有一种方法也可以使用dplyr::select中的“contains”或“ends_with”或“start_with” 我意识到我可以使用下面的索引…这很有效如何在管道中使用Dplyr::Select函数Purrr:map2all,r,tidyverse,R,Tidyverse,使用示例数据(底部),我正在尝试下面的代码,但我一直坚持使用这种策略,即在map2中使用dplyr::select函数按名称选择列。这个特定的示例使用regex,但我希望有一种方法也可以使用dplyr::select中的“contains”或“ends_with”或“start_with” 我意识到我可以使用下面的索引…这很有效 library(tidyverse) 但由于我的真实数据集有许多列名,我只想使用“select”函数来命名它们,或者使用regex。我尝试过下面代码的变体,但似乎都不
library(tidyverse)
但由于我的真实数据集有许多列名,我只想使用“select”函数来命名它们,或者使用regex。我尝试过下面代码的变体,但似乎都不起作用。我怎样才能纠正这个问题
下面的代码首先是子集,因为我只需要处理的变量,然后通过管道导入map2
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,.)
Df%select(代码、宠物、匹配项(^q.*s$)、匹配项(^q.*i$)%%
map2(Df(匹配项(“^q.*i$”),Df(匹配项(“^q.*s$”)),~if_else(.x!=1,
重新编码(.y,`1`=0,`2`=0,`3`=0,`4`=1,`5`=1),88))%>%
as.data.frame%>%
重命名所有(粘贴0,“\u新建”)%%>%
cbind(Df,.)
示例数据:
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也许这就是你想要的:
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)
结果:
library(dplyr)
library(purrr)
list(select(Df, matches("^q.*i$")), select(Df, matches("^q.*s$"))) %>%
pmap( ~ 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,.)
注意事项:
library(dplyr)
library(purrr)
list(select(Df, matches("^q.*i$")), select(Df, matches("^q.*s$"))) %>%
pmap( ~ 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,.)
如果使用正确的索引,则这与您的结果相匹配:
Code Pet q25U q26U q27U q28U q29U q25i q26i q27i q28i q29i q25s q26s q27s q28s q29s
1 P1 Dog 2 5 4 4 4 2 2 2 88 1 3 4 3 4 88
2 AB Cat 4 4 3 3 3 1 88 2 1 1 5 4 3 5 88
3 AB Dog 4 6 2 2 5 88 88 1 1 1 88 5 4 88 3
4 P1 Fish 4 5 3 3 5 2 88 1 2 2 4 5 1 1 4
5 P1 Dog 4 4 3 3 4 1 2 1 2 2 1 1 4 3 4
6 CD Cat 4 3 3 2 3 2 2 1 2 1 4 4 5 2 3
7 AAA Rabbit 5 6 2 3 3 2 2 1 2 88 4 4 5 2 3
8 CD Fish 4 7 1 1 2 2 1 2 88 2 5 3 3 2 2
q25i_new q26i_new q27i_new q28i_new q29i_new
1 0 1 0 1 88
2 88 1 0 88 88
3 88 1 88 88 88
4 1 1 88 0 1
5 88 0 88 0 1
6 1 1 88 0 88
7 1 1 88 0 0
8 1 88 0 0 0
使用pmap
而不是map2
的原因是pmap
接受一个输入列表,而map2
只接受两个输入。例如,以下使用map2
而不是pmap
:
map2(Df[8:12],Df[13:17],~ 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,.)
这不太方便,因为您必须手动指定输入,并且必须用{}
包装map2
,以覆盖第一个参数中管道的%%>%
默认值。如果您能提供一个最小的工作示例dataI expansed,那么会有所帮助……行吗?行了。但奇怪的是为什么pmap而不是map2?@迈克很高兴它能帮上忙!我现在看到评论了,这正是我想要的解释,谢谢。