多个 mutate() 与 pmap?
multiple mutate() with pmap?
我有一个可容纳 10 个会话的数据集,每个会话都有两个团队成员的 ID#。我想将 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(.)))
这给出了
subj team.s1 team.s2
1 1001 21-21 23-21
2 1002 44-55 44-77
有没有办法制作一个包含 e1 = 10 个团队名称、e2 = 10 ID#1、e3 = 10 ID#2 并在 pmap 中使用 mutate 的 3 元素列表?或者其他一些避免 10 条变异线的 wat?
我不知道如何将数据框名称放入 mutate
一个选项可以是 split
基于列名后缀的数据框,即 s1/s2
或会话,然后为每个会话粘贴带有 do.call(paste, ...)
的列:
使用 tidyverse
(版本 1.2.1):
df2 %>%
split.default(sub('id[12]\.(s[0-9]+)', '\1', names(.))) %>%
map_dfc(~do.call(paste, c(sep="-", .)))
# A tibble: 2 x 3
# s1 s2 subj
# <chr> <chr> <chr>
#1 21-21 23-21 1001
#2 44-55 44-77 1002
基于 tidyr 的 gather
和 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
数据
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))
我有一个可容纳 10 个会话的数据集,每个会话都有两个团队成员的 ID#。我想将 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(.)))
这给出了
subj team.s1 team.s2
1 1001 21-21 23-21
2 1002 44-55 44-77
有没有办法制作一个包含 e1 = 10 个团队名称、e2 = 10 ID#1、e3 = 10 ID#2 并在 pmap 中使用 mutate 的 3 元素列表?或者其他一些避免 10 条变异线的 wat?
我不知道如何将数据框名称放入 mutate
一个选项可以是 split
基于列名后缀的数据框,即 s1/s2
或会话,然后为每个会话粘贴带有 do.call(paste, ...)
的列:
使用 tidyverse
(版本 1.2.1):
df2 %>%
split.default(sub('id[12]\.(s[0-9]+)', '\1', names(.))) %>%
map_dfc(~do.call(paste, c(sep="-", .)))
# A tibble: 2 x 3
# s1 s2 subj
# <chr> <chr> <chr>
#1 21-21 23-21 1001
#2 44-55 44-77 1002
基于 tidyr 的 gather
和 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
数据
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))