R 是否使用pmap进行多次mutate()操作?

R 是否使用pmap进行多次mutate()操作?,r,dplyr,mutate,pmap,tidyr,R,Dplyr,Mutate,Pmap,Tidyr,我有一个10个会话的数据集,每个会话都有两个团队成员的ID。我想将to ID粘贴在一起以形成团队ID。我可以用10个变种(每个团队一个)来实现这一点,但我正试图找到一种方法,在地图或pmap中有1个变种 下面是一个只有2个会话的简单数据示例 df2 <- data.frame( subj = c(1001,1002), id1.s1 = c(21, 44), id2.s1 = c(21, 55),

我有一个10个会话的数据集,每个会话都有两个团队成员的ID。我想将to ID粘贴在一起以形成团队ID。我可以用10个变种(每个团队一个)来实现这一点,但我正试图找到一种方法,在地图或pmap中有1个变种

下面是一个只有2个会话的简单数据示例

df2 <- data.frame( subj = c(1001,1002),
               id1.s1 = c(21, 44), 
               id2.s1 = c(21, 55), 
               id1.s2 = c(23, 44), 
               id2.s2 = c(21, 77))

df2 <- df2 %>%
  mutate(team.s1=paste(id1.s1, id2.s1, sep="-")) %>%
  mutate(team.s2=paste(id1.s2, id2.s2, sep="-")) %>%
  select(grep("subj|team", names(.)))
有没有办法制作一个包含e1=10个团队名称、e2=10个ID#1、e3=10个ID#2的3元素列表,并在pmap内部使用mutate?或者其他避免10条变异线的wat


我不知道如何将数据框名称转换为mutate

一个选项可以是
根据列名的后缀拆分数据框,即
s1/s2
或会话,然后为每个会话使用
do.call(粘贴…)

使用
tidyverse
(版本1.2.1):

df2%>%
split.default(sub('id[12]\\.(s[0-9]+)','\\1',names(.))%>%
map_dfc(~do.call(粘贴,c(sep=“-”,))
#一个tibble:2x3
#s1 s2主题
#    
#1 21-21 23-21 1001 
#2 44-55 44-77 1002 

一个选项可以是
根据列名后缀拆分数据框,即
s1/s2
或会话,然后为每个会话粘贴带有
do.call(粘贴,…)

使用
tidyverse
(版本1.2.1):

df2%>%
split.default(sub('id[12]\\.(s[0-9]+)','\\1',names(.))%>%
map_dfc(~do.call(粘贴,c(sep=“-”,))
#一个tibble:2x3
#s1 s2主题
#    
#1 21-21 23-21 1001 
#2 44-55 44-77 1002 
基于的
聚集
扩散
功能的解决方案。
separate
功能是根据模式分隔一列

library(dplyr)
library(tidyr)

df2 <- df1 %>%
  gather(ID_S, Value, -subj) %>%
  separate(ID_S, into = c("ID", "S")) %>%
  group_by(subj, S) %>%
  summarise(Value = paste(Value, collapse = "-")) %>%
  mutate(S = paste0("team.", S)) %>%
  spread(S, Value) %>%
  ungroup()
df2
# # A tibble: 2 x 3
# subj team.s1 team.s2
# * <dbl> <chr>   <chr>  
# 1  1001 21-21   23-21  
# 2  1002 44-55   44-77
库(dplyr)
图书馆(tidyr)
df2%
聚集(ID,值,-subc)%>%
分开(ID_S,分为=c(“ID”,“S”))%>%
(受试者)分组%>%
摘要(值=粘贴(值,折叠“-”)%>%
突变(S=0(“团队”,S))%>%
价差%>%
解组()
df2
##tibble:2 x 3
#Sub团队s1团队s2
# *       
# 1  1001 21-21   23-21  
# 2  1002 44-55   44-77
数据

df1 <- data.frame( subj = c(1001,1002),
                   id1.s1 = c(21, 44), 
                   id2.s1 = c(21, 55), 
                   id1.s2 = c(23, 44), 
                   id2.s2 = c(21, 77))
df1基于的
collect
spread
函数的解决方案。
separate
功能是根据模式分隔一列

library(dplyr)
library(tidyr)

df2 <- df1 %>%
  gather(ID_S, Value, -subj) %>%
  separate(ID_S, into = c("ID", "S")) %>%
  group_by(subj, S) %>%
  summarise(Value = paste(Value, collapse = "-")) %>%
  mutate(S = paste0("team.", S)) %>%
  spread(S, Value) %>%
  ungroup()
df2
# # A tibble: 2 x 3
# subj team.s1 team.s2
# * <dbl> <chr>   <chr>  
# 1  1001 21-21   23-21  
# 2  1002 44-55   44-77
库(dplyr)
图书馆(tidyr)
df2%
聚集(ID,值,-subc)%>%
分开(ID_S,分为=c(“ID”,“S”))%>%
(受试者)分组%>%
摘要(值=粘贴(值,折叠“-”)%>%
突变(S=0(“团队”,S))%>%
价差%>%
解组()
df2
##tibble:2 x 3
#Sub团队s1团队s2
# *       
# 1  1001 21-21   23-21  
# 2  1002 44-55   44-77
数据

df1 <- data.frame( subj = c(1001,1002),
                   id1.s1 = c(21, 44), 
                   id2.s1 = c(21, 55), 
                   id1.s2 = c(23, 44), 
                   id2.s2 = c(21, 77))

df1你的回答让我意识到我没有回答OP的问题你可以用同样的方式编程使用
tidyr::unite
,例如
df2%>%split.default(sub('.\\\\\.([^.]*)$,'\\1',name()%>%imap\u-dfc(~unite(.x,!!.y,sep='-'))
@alistaire好主意!你的回答让我意识到我没有回答OP的问题你可以用同样的方式编程使用
tidyr::unite
,例如
df2%>%split.default(sub('.\\\\\.([^.]*)$,'\\1',names()%>%imap\u-dfc(~unite(.x,!!.y,sep='-'))
@alistaire好主意!谢谢@www,这似乎是我问的。我会学习每一步来理解。谢谢@www,这似乎就是我所要求的。我会学习每一步来理解。