问题描述
我需要将长数据转换为宽数据,但需要根据需要创建新的编号列(col1、col2 等)。 (换句话说,col 名称不是从键中获取的,而是一般生成的。)所以从这样的事情:
d <- data.frame(row_id = c(1,1,2,3,3),cat = c("a","b","a","d","e","f","g"))
row_id cat
1 1 a
2 1 b
3 2 a
4 2 d
5 2 e
6 3 d
7 3 f
8 3 g
这样的事情:
row_id,cat1,cat2,cat3
1,a,b,d,e
3,f,g
spread() 和 pivot_wider() 并不真正符合要求,因为我正在处理分类值和大量类别(但每个 ID 不超过 8 个)。在 python 中,我可能会遍历行,将新的键:值对 ("cat"+i:"a") 附加到列表(或其他东西)中的字典,但不确定 R 或如果有更好的方法。
解决方法
我们通过'row_id'创建一个序列列,然后使用pivot_wider
library(dplyr)
library(tidyr)
library(stringr)
library(data.table)
d %>%
mutate(rn = str_c('cat',rowid(row_id))) %>%
pivot_wider(names_from = rn,values_from = cat)
-输出
# A tibble: 3 x 4
# row_id cat1 cat2 cat3
# <dbl> <chr> <chr> <chr>
#1 1 a b <NA>
#2 2 a d e
#3 3 d f g