0

我有一个可容纳 10 个会话的数据集,每个会话都有两个团队成员的 ID#。我想将 ID#s 粘贴在一起以形成团队 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 的 3 元素列表并在 pmap 中使用 mutate?或者其他一些避免 10 条变异线的笏?

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

4

2 回答 2

3

基于gatherspread函数的解决方案。功能是根据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))
于 2018-01-12T03:35:19.710 回答
1

一个选项可能是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 
于 2018-01-12T03:32:53.487 回答