R 中用于分类数据的行到列w 通用编号列?

问题描述

我需要将长数据转换为宽数据,但需要根据需要创建新的编号列(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