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)
我研究过熔化和铸造以及其他一些东西,但似乎没有一个能胜任这项工作。
您可以为 的每个唯一值创建唯一的行号AAA,然后转换为宽格式。
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 \nRun Code Online (Sandbox Code Playgroud)\n使用data.table-
library(data.table)\nsetDT(test.data)\n\ndcast(test.data[, row := seq_len(.N), AAA], \n AAA ~ row, value.var = c("BBB", "CCC", "DDD"))\nRun Code Online (Sandbox Code Playgroud)\n