От длинного до широкого формата в R на основе одного столбца

#r

#r

Вопрос:

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

Итак, переходя от:

  • Идентификационный номер сканирования
  • 1 E43
  • 1 E56
  • 2 E65
  • 2 E98

Для

  • Идентификационный номер сканирования1 Номер сканирования2
  • 1 E43 E56
  • 2 E65 E98

Например, длинный формат я хотел бы преобразовать в широкий формат на основе идентификатора,

к: Широкоформатный

Большое спасибо

Ответ №1:

Попробуйте этот tidyverse подход. Ваши данные находятся в формате long, поэтому вам нужно изменить формат на wide. Здесь код:

 library(tidyverse)
#Code
df %>% group_by(ID) %>% mutate(Var=paste0('Scan_Number_',1:n())) %>%
  pivot_wider(names_from = Var,values_from=Scan_Number)
  

Вывод:

 # A tibble: 2 x 3
# Groups:   ID [2]
     ID Scan_Number_1 Scan_Number_2
  <int> <chr>         <chr>        
1     1 E43           E56          
2     2 E65           E98   
  

Некоторые используемые данные:

 #Data
df <- structure(list(ID = c(1L, 1L, 2L, 2L), Scan_Number = c("E43", 
"E56", "E65", "E98")), class = "data.frame", row.names = c(NA, 
-4L))
  

Ответ №2:

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

 library(data.table)
dcast(setDT(df), ID ~ paste0("Scan_Number", rowid(ID)), value.var = 'Scan_Number')
#   ID Scan_Number1 Scan_Number2
#1:  1          E43          E56
#2:  2          E65          E98
  

данные

 df <-  structure(list(ID = c(1L, 1L, 2L, 2L), Scan_Number = c("E43", 
"E56", "E65", "E98")), class = "data.frame", row.names = c(NA, 
-4L))