В data.table воплощении dcast()
можно изменить несколько столбцов одновременно.С последующим переупорядочением и переименованием столбцов это может быть использовано для преобразования data.frame со многими строками в широкий формат.
Первый порядок строк
в соответствии с запросом OP:
library(data.table)
# specify number of splits
n_splits <- 6
# reshape to wide format
wide <- as.data.table(df)[, rn := rep(1:.N, each = n_splits, length.out = .N)][
, dcast(.SD, rn ~ rowid(rn), as.character, value.var = colnames(df), fill = "")][
, rn := NULL][]
# reorder columns
setcolorder(wide, as.vector(outer(colnames(df), 1:n_splits, paste, sep = "_")))
# rename columns
setnames(wide, rep(colnames(df), n_splits))
wide
depnais n depnais n depnais n depnais n depnais n depnais n
1: 01 4051 02 5163 03 3323 04 1176 05 1394 06 12624
2: 07 2623 08 2194 09 1227 10 3266 11 3111 12 2528
3: 13 26737 14 7105 15 1096 16 3194 17 5173 18 2592
4: 19 2323 21 5993 22 4952 23 571
Обратите внимание, что результат транспонируется в соответствии с запросом OP, например, строки с 1 по 6 из df
печатаются горизонтально по первой строке разделения ( первый ряд строк) .
Неполные строки в разбиении обрабатываются автоматически.Все столбцы приводятся к символу, а пропущенные значения заполняются ""
.
Это будет работать и для других разбиений, например, n_splits <- 4
:
depnais n depnais n depnais n depnais n
1: 01 4051 02 5163 03 3323 04 1176
2: 05 1394 06 12624 07 2623 08 2194
3: 09 1227 10 3266 11 3111 12 2528
4: 13 26737 14 7105 15 1096 16 3194
5: 17 5173 18 2592 19 2323 21 5993
6: 22 4952 23 571
Первый порядок столбцов
Для полноты первого порядка столбцов можно добиться с небольшими изменениями при создании rn
:
library(data.table)
# specify number of splits
n_splits <- 6
# reshape to wide format, fill by column (column first order)
wide <- as.data.table(df)[, rn := rep(1:ceiling(.N/n_splits), length.out = .N)][][
, dcast(.SD, rn ~ rowid(rn), as.character, value.var = colnames(df), fill = "")][
, rn := NULL][]
# reorder columns
setcolorder(wide, as.vector(outer(colnames(df), 1:n_splits, paste, sep = "_")))
# rename columns
setnames(wide, rep(colnames(df), n_splits))
wide
depnais n depnais n depnais n depnais n depnais n depnais n
1: 01 4051 05 1394 09 1227 13 26737 17 5173 22 4952
2: 02 5163 06 12624 10 3266 14 7105 18 2592 23 571
3: 03 3323 07 2623 11 3111 15 1096 19 2323
4: 04 1176 08 2194 12 2528 16 3194 21 5993
Данные
Данные, первоначально предоставленные OP, возвратили предупреждение поврежденный фрейм данных .Это исправлено:
df <- structure(list(depnais = c("01", "02", "03", "04", "05", "06",
"07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "21", "22", "23"), n = c(4051L, 5163L, 3323L, 1176L,
1394L, 12624L, 2623L, 2194L, 1227L, 3266L, 3111L, 2528L, 26737L,
7105L, 1096L, 3194L, 5173L, 2592L, 2323L, 5993L, 4952L, 571L)), class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -22L))