簡體   English   中英

根據列名R的共性堆疊列

[英]Stacking columns based on commonality of column name R

好的,所以我想自動獲取名稱相似的列,例如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

如果在spread之后一直保留k的額外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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM