好的,所以我想以一种自动的方式,在名称中使用相似的列,例如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)
我不知道该怎么逃避。
这看起来像你想要的输出吗?
# 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()