Несколько mutate() с pmap?
У меня есть набор данных, широкий для 10 сеансов, и каждый сеанс имеет идентификаторы # для двух членов команды. Я хочу вставить идентификаторы вместе, чтобы сформировать идентификаторы команд. Я могу сделать это с 10 mutate (по одному для каждой команды), но я пытаюсь найти способ сделать 1 mutate внутри карты или pmap.
Простой пример данных только с двумя сессиями
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
Есть ли способ сделать список из 3 элементов с e1 = 10 именами команд, e2 = 10 ID#1, e3 = 10 ID#2 и использовать mutate внутри pmap? ИЛИ какой-нибудь другой ват, который избегает 10 мутированных строк?
Я не мог понять, как получить имя фрейма данных в mutate
2 ответа
Решение на основе тидыров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))
Один вариант может быть 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