Укладка столбцов на основе общности имени столбца R - PullRequest
0 голосов
/ 10 марта 2019

Хорошо, так что я бы хотел, чтобы автоматически брать столбцы с похожими именами, например, 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 голосов
/ 10 марта 2019

Похоже ли это на ваш желаемый результат?

# 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, вы можете избежать неоднозначной ошибки идентификатора.Здесь я назвал эту дополнительную информацию 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...