如何在r中将数据从长格式重塑为宽格式?

gup*_*pta 0 r reshape data.table

现在,我有相同的输入数据框:

AAA <- c('APIS', 'APIS', 'PIPIS', 'AGAROS', 'AGAROS', 'AGAROS', 'NOTHING')
BBB <- c('a', 'a', 'a', 'b', 'b', 'c', NA)
CCC <- c(1, 2, NA, 4, 5, 6, 7)
DDD <- c("Mat", "ASG", "MNT", "NBEH", "DJ", "EU", "DHR")
test.data <- data.frame(AAA, BBB, CCC, DDD)
test.data
Run Code Online (Sandbox Code Playgroud)

我想重塑它,使每个唯一的“AAA”变量成为单行。“AAA”变量的多次输入会自动成为带有后缀或前缀 1,2,3..... 的新列,如下所示:

AAA <- c('APIS', 'PIPIS', 'AGAROS', 'NOTHING')
BBB_1 <- c('a', 'a', 'b', NA)
CCC_1 <- c(1, NA, 4, 7)
DDD_1 <- c("Mat", "MNT", "NBEH", "DHR")

BBB_2 <- c('a', NA, 'b', NA)
CCC_2 <- c(2, NA, 5, NA)
DDD_2 <- c("ASG", NA, "DJ", NA)

BBB_3 <- c(NA, NA, 'c', NA)
CCC_3 <- c(NA, NA, 6, NA)
DDD_3 <- c(NA, NA, "EU", NA)

output <- data.frame(AAA, BBB_1, CCC_1, DDD_1, BBB_2, CCC_2, DDD_2, 
                        BBB_3, CCC_3, DDD_3)
output
Run Code Online (Sandbox Code Playgroud)

我研究过熔化和铸造以及其他一些东西,但似乎没有一个能胜任这项工作。

Ron*_*hah 5

您可以为 的每个唯一值创建唯一的行号AAA,然后转换为宽格式。

\n
library(dplyr)\nlibrary(tidyr)\n\ntest.data %>%\n  mutate(row = row_number(), .by = AAA) %>%\n  pivot_wider(names_from = row, values_from = BBB:DDD, names_vary = "slowest")\n\n# A tibble: 4 \xc3\x97 10\n#  AAA     BBB_1 CCC_1 DDD_1 BBB_2 CCC_2 DDD_2 BBB_3 CCC_3 DDD_3\n#  <chr>   <chr> <dbl> <chr> <chr> <dbl> <chr> <chr> <dbl> <chr>\n#1 APIS    a         1 Mat   a         2 ASG   NA       NA NA   \n#2 PIPIS   a        NA MNT   NA       NA NA    NA       NA NA   \n#3 AGAROS  b         4 NBEH  b         5 DJ    c         6 EU   \n#4 NOTHING NA        7 DHR   NA       NA NA    NA       NA NA   \n
Run Code Online (Sandbox Code Playgroud)\n

使用data.table-

\n
library(data.table)\nsetDT(test.data)\n\ndcast(test.data[, row := seq_len(.N), AAA], \n      AAA ~ row, value.var = c("BBB", "CCC", "DDD"))\n
Run Code Online (Sandbox Code Playgroud)\n