Мы можем сделать pivot_wider
непосредственно для нескольких столбцов после создания столбца последовательности по идентификатору
library(dplyr)
library(tidyr)
df1 %>%
group_by(ID) %>%
mutate(rn = row_number()) %>%
ungroup %>%
pivot_wider(names_from = rn, values_from = c(X2, X3, X4), names_sep=".")
# A tibble: 2 x 7
# ID X2.1 X2.2 X3.1 X3.2 X4.1 X4.2
# <dbl> <chr> <chr> <chr> <chr> <chr> <chr>
#1 1 abc xyz abc xyz abc xyz
#2 2 abc <NA> abc <NA> abc <NA>
или с использованием data.table
library(data.table)
dcast(setDT(df1), ID ~ rowid(ID), value.var = c("X2", "X3", "X4"), sep=".")
# ID X2.1 X2.2 X3.1 X3.2 X4.1 X4.2
#1: 1 abc xyz abc xyz abc xyz
#2: 2 abc <NA> abc <NA> abc <NA>
данных
df1 <- structure(list(ID = c(1, 1, 2), X2 = c("abc", "xyz", "abc"),
X3 = c("abc", "xyz", "abc"), X4 = c("abc", "xyz", "abc")), class = "data.frame", row.names = c(NA,
-3L))