R 是否使用pmap进行多次mutate()操作?
我有一个10个会话的数据集,每个会话都有两个团队成员的ID。我想将to ID粘贴在一起以形成团队ID。我可以用10个变种(每个团队一个)来实现这一点,但我正试图找到一种方法,在地图或pmap中有1个变种 下面是一个只有2个会话的简单数据示例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),
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,这似乎就是我所要求的。我会学习每一步来理解。