#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))