R: pivot_wider () для расширения фрейма данных

У меня возникли проблемы с переводом фрейма данных в широкий формат с помощью pivot_wider. Мой фрейм данных выглядит так:

Data <- read.table(header = T, text = "
        ID  A         B           C           D
         1  6.01764 0.00409222  0.000500143 101.816
         1  6.01769 0.00431931  0.000565946 101.334
         1  6.01774 0.00454617  0.00063163  101.923
         2  6.01779 0.00477308  0.000697374 101.914
         2  6.01784 0.00500005  0.000763118 101.905
         2  6.0179  0.00522703  0.000828803 101.926
         3  6.01795 0.005454    0.000894606 101.889
         3  6.018   0.00568086  0.000960231 101.895
         3  6.01805 0.00590783  0.00102603  101.87
")

Я хотел бы создать уникальные имена столбцов, объединив идентификатор с именем столбца, чтобы он выглядел так:

Datalong <- read.table(header = T, text = "
1A  1B  1C  1D  2A  2B  2C  2D  3A  3B  3C  3D
6.01764 0.00409222  0.000500143 101.816 6.01779 0.00477308  0.000697374 101.914 6.01795 0.005454    0.000894606 101.889
6.01769 0.00431931  0.000565946 101.334 6.01784 0.00500005  0.000763118 101.905 6.018   0.00568086  0.000960231 101.895
6.01774 0.00454617  0.00063163  101.923 6.0179  0.00522703  0.000828803 101.926 6.01805 0.00590783  0.00102603  101.87
")

Я думаю, мне может потребоваться добавить новый столбец, в котором будет учитываться каждый экземпляр столбца идентификатора (поскольку это данные временного ряда)

Я пытался:

DataNew <- Data %>% pivot_wider(names_from = ID, values_from = c(ID, colnames(Data)))

А также

Data %>% group_by(ID) %>% mutate(time = row_number()) %>% pivot_wider(names_from = time, values_from = c(ID, colnames(Data)))

но безрезультатно. Любая поддержка будет принята с благодарностью!


person w.fahey    schedule 03.12.2020    source источник
comment
Пожалуйста, добавляйте свои данные в правильном формате!   -  person Duck    schedule 03.12.2020
comment
Извинения - он обновлен сейчас   -  person w.fahey    schedule 03.12.2020


Ответы (2)


Как насчет этого:

DataNew <- Data %>% 
  pivot_longer(-ID, names_to="var", values_to="vals") %>% 
  group_by(ID, var) %>% 
  mutate(obs =1:n(), 
         vnames = paste0(ID, var)) %>% 
  ungroup %>% 
  select(-c(ID, var)) %>%
  pivot_wider(names_from = vnames, values_from = vals) %>% 
  select(-obs)

DataNew
# # A tibble: 3 x 12
#   `1A`    `1B`    `1C`  `1D`  `2A`    `2B`    `2C`  `2D`  `3A`    `3B`
#   <dbl>   <dbl>   <dbl> <dbl> <dbl>   <dbl>   <dbl> <dbl> <dbl>   <dbl>
# 1  6.02 0.00409 5.00e-4  102.  6.02 0.00477 6.97e-4  102.  6.02 0.00545
# 2  6.02 0.00432 5.66e-4  101.  6.02 0.00500 7.63e-4  102.  6.02 0.00568
# 3  6.02 0.00455 6.32e-4  102.  6.02 0.00523 8.29e-4  102.  6.02 0.00591
# # … with 2 more variables: `3C` <dbl>, `3D` <dbl>
person DaveArmstrong    schedule 03.12.2020
comment
Это отлично сработало, Дэйв. Большое спасибо за Вашу помощь! - person w.fahey; 03.12.2020

Мы можем использовать dcast из data.table

library(data.table)
dcast(setDT(Data), rowid(ID) ~ ID, value.var = c('A', 'B', 'C', 'D'))
person akrun    schedule 03.12.2020