根据列名R的通用性堆叠列

问题描述 投票:0回答:1

好的,所以我想以一种自动的方式,在名称中使用相似的列,例如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)

我不知道该怎么逃避。

r dplyr purrr
1个回答
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()

© www.soinside.com 2019 - 2024. All rights reserved.