R 中用于分类数据的行到列(w 通用编号列)?
Rows to Columns in R for categorical data (w generic numbered cols)?
我需要将长数据转换为宽数据,但需要根据需要创建新的编号列(col1、col2 等)。 (换句话说,col 名称不是从键中获取的,而是一般生成的。)所以从这样的事情开始:
d <- data.frame(row_id = c(1,1,2,2,2,3,3,3),cat = c("a","b","a","d","e","d","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,,
2,a,d,e
3,d,f,g
spread() 和 pivot_wider() 不太符合要求,因为我正在处理分类值和大量类别(但每个 ID 不超过 8 个)。在 python 中,我可能会遍历行,将新的 key:value 对 ("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
我需要将长数据转换为宽数据,但需要根据需要创建新的编号列(col1、col2 等)。 (换句话说,col 名称不是从键中获取的,而是一般生成的。)所以从这样的事情开始:
d <- data.frame(row_id = c(1,1,2,2,2,3,3,3),cat = c("a","b","a","d","e","d","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,,
2,a,d,e
3,d,f,g
spread() 和 pivot_wider() 不太符合要求,因为我正在处理分类值和大量类别(但每个 ID 不超过 8 个)。在 python 中,我可能会遍历行,将新的 key:value 对 ("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