好,所以我想自动获取名称相似的列,例如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)
我不确定该如何逃脱。
答案 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()