R 从长到宽的数据框只有 2 列
R long to wide data frame with only 2 columns
我正试图在 R 中解决这个非常微不足道的问题,但我不太明白。我有一个只有两列的数据框。
> dput(rrr)
structure(list(row = c(1, 2, 3, 4, 1, 2, 4, 6, 1, 3, 4, 5, 1,
4, 2, 3, 6, 7, 5, 3, 5, 4, 7, 8, 2, 6, 4, 7, 10, 4, 7, 5, 6,
10, 9, 8, 5, 8, 7, 9, 7, 9, 8, 10, 6, 10, 7, 9), col = c("1",
"1", "1", "1", "2", "2", "2", "2", "3", "3", "3", "3", "4", "4",
"4", "4", "4", "4", "4", "5", "5", "5", "5", "5", "6", "6", "6",
"6", "6", "7", "7", "7", "7", "7", "7", "7", "8", "8", "8", "8",
"9", "9", "9", "9", "10", "10", "10", "10")), row.names = c(1L,
2L, 4L, 6L, 16L, 17L, 19L, 21L, 31L, 32L, 34L, 36L, 46L, 47L,
48L, 50L, 53L, 55L, 57L, 58L, 59L, 60L, 63L, 65L, 70L, 71L, 72L,
75L, 77L, 82L, 83L, 84L, 86L, 89L, 91L, 93L, 94L, 95L, 96L, 99L,
109L, 110L, 111L, 115L, 125L, 126L, 127L, 129L), class = "data.frame")
我想理想地从这个开始:
对此:
与行中每个值相匹配的列中的数字被写在新列中的旁边。理想情况下,当数字与您在下面的示例中看到的相同时,我不想在新列中写入数字。
我曾尝试使用重塑,但我迷路了,因为我只有 2 列,而我看到的大多数示例都有 3 列。
我希望有一个人可以帮助我。
谢谢!
我们创建一个序列列并进行数据透视
library(dplyr)
library(tidyr)
library(data.table)
rrr %>%
mutate(rn = rowid(row)) %>%
pivot_wider(names_from = rn, values_from = col)
# A tibble: 10 x 8
# row `1` `2` `3` `4` `5` `6` `7`
# <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 1 1 2 3 4 <NA> <NA> <NA>
# 2 2 1 2 4 6 <NA> <NA> <NA>
# 3 3 1 3 4 5 <NA> <NA> <NA>
# 4 4 1 2 3 4 5 6 7
# ...
或 data.table
dcast(setDT(rrr), row ~ rowid(row), value.var = 'col')
我正试图在 R 中解决这个非常微不足道的问题,但我不太明白。我有一个只有两列的数据框。
> dput(rrr)
structure(list(row = c(1, 2, 3, 4, 1, 2, 4, 6, 1, 3, 4, 5, 1,
4, 2, 3, 6, 7, 5, 3, 5, 4, 7, 8, 2, 6, 4, 7, 10, 4, 7, 5, 6,
10, 9, 8, 5, 8, 7, 9, 7, 9, 8, 10, 6, 10, 7, 9), col = c("1",
"1", "1", "1", "2", "2", "2", "2", "3", "3", "3", "3", "4", "4",
"4", "4", "4", "4", "4", "5", "5", "5", "5", "5", "6", "6", "6",
"6", "6", "7", "7", "7", "7", "7", "7", "7", "8", "8", "8", "8",
"9", "9", "9", "9", "10", "10", "10", "10")), row.names = c(1L,
2L, 4L, 6L, 16L, 17L, 19L, 21L, 31L, 32L, 34L, 36L, 46L, 47L,
48L, 50L, 53L, 55L, 57L, 58L, 59L, 60L, 63L, 65L, 70L, 71L, 72L,
75L, 77L, 82L, 83L, 84L, 86L, 89L, 91L, 93L, 94L, 95L, 96L, 99L,
109L, 110L, 111L, 115L, 125L, 126L, 127L, 129L), class = "data.frame")
我想理想地从这个开始:
对此:
与行中每个值相匹配的列中的数字被写在新列中的旁边。理想情况下,当数字与您在下面的示例中看到的相同时,我不想在新列中写入数字。 我曾尝试使用重塑,但我迷路了,因为我只有 2 列,而我看到的大多数示例都有 3 列。 我希望有一个人可以帮助我。 谢谢!
我们创建一个序列列并进行数据透视
library(dplyr)
library(tidyr)
library(data.table)
rrr %>%
mutate(rn = rowid(row)) %>%
pivot_wider(names_from = rn, values_from = col)
# A tibble: 10 x 8
# row `1` `2` `3` `4` `5` `6` `7`
# <dbl> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 1 1 2 3 4 <NA> <NA> <NA>
# 2 2 1 2 4 6 <NA> <NA> <NA>
# 3 3 1 3 4 5 <NA> <NA> <NA>
# 4 4 1 2 3 4 5 6 7
# ...
或 data.table
dcast(setDT(rrr), row ~ rowid(row), value.var = 'col')