根据列名R的共性堆叠列

时间:2019-03-10 00:56:18

标签: r dplyr purrr

好,所以我想自动获取名称相似的列,例如x1,x2,...,xn或y_1,y_2,y_3,...,y_n基于对。 首先让我们做一些数据:

set.seed(1)
data <- purrr::rerun(3, x = runif(10), y = rnorm(10)) %>%
dplyr::bind_cols() %>%
dplyr::mutate(id1 = letters[1:10], id2 = LETTERS[1:10])

然后我希望将所有成对的x1,x2,x3和y1,y2,y3变成两列x,y,然后在其后有两个id列(将重复堆栈)。有一个简单的方法吗? 这是我目前的尝试:

data %>%
gather('k', 'v', -id1, -id2) %>%
mutate(k = str_remove(k, '[0-9]')) %>%
split(.$k) %>%
lapply(function(x) spread(x, 'k', 'v'))

但是它给了我以下错误:

Error: Duplicate identifiers for rows (1, 11, 21), (2, 12, 22), (3, 13, 23), (4, 14, 24), (5, 15, 25), (6, 16, 26), (7, 17, 27), (8, 18, 28), (9, 19, 29), (10, 20, 30)

我不确定该如何逃脱。

1 个答案:

答案 0 :(得分:0)

这看起来像您想要的输出吗?

# A tibble: 30 x 4
   id1   id2       x       y
   <chr> <chr> <dbl>   <dbl>
 1 a     A     0.266 -0.820 
 2 a     A     0.482  0.919 
 3 a     A     0.913 -0.415 
 4 b     B     0.372  0.487 
 5 b     B     0.600  0.782 
 6 b     B     0.294 -0.394 
 7 c     C     0.573  0.738 
 8 c     C     0.494  0.0746
 9 c     C     0.459 -0.0593
10 d     D     0.908  0.576 
# … with 20 more rows

如果在k之后一直保留spread中的额外ID信息,则可以避免模棱两可的ID错误。在这里,我将这些额外信息称为k2

data %>%
  gather('k', 'v', -id1, -id2) %>%
  mutate(k2 = str_replace(k, "\\D", ""),
         k = str_replace(k, "\\d", "")) %>%
  spread('k', 'v') %>%
  select(-k2)

然后,您可以在末尾放下k2,不需要split() %>% lapply()