我的数据具有以下形式:
groups <- c("4","4.2","4.2.1","4.2.1.1", "1", "1.2", "1.2.1", "1.2.1.2","1.2.1.2.1")
x <- data.frame(ID = c(rep("samp_1", 4), rep("samp_2", 5)), Group = groups)
我怎么得到这个?:
ID col_1 col_2 col_3 col_4 col_5
samp_1 4 4.2 4.2.1 4.2.1.1 NA
samp_2 1 1.2 1.2.1 1.2.1.2 1.2.1.2.1
每一列将由字符串的长度确定,因此列4中的所有数据的长度将为4(或长度7(包括点)。
我正在寻找最通用的解决方案(例如,使用循环;使用尽可能少的包),因为我需要同时在R和Python中实现此方法。
在R
中,我们可以使用rowid
(从data.table
开始)为新名称创建一列,并转向“宽”格式
library(dplyr)
library(data.table)
library(stringr)
x %>%
mutate(name = str_c('col_', rowid(ID))) %>%
pivot_wider(names_from = name, values_from = Group)
# A tibble: 2 x 6
# ID col_1 col_2 col_3 col_4 col_5
# <chr> <chr> <chr> <chr> <chr> <chr>
#1 samp_1 4 4.2 4.2.1 4.2.1.1 <NA>
#2 samp_2 1 1.2 1.2.1 1.2.1.2 1.2.1.2.1
或使用data.table
library(data.table)
dcast(setDT(x), ID ~ paste0('col_', rowid(ID)), value.var = 'Group')
# ID col_1 col_2 col_3 col_4 col_5
#1: samp_1 4 4.2 4.2.1 4.2.1.1 <NA>
#2: samp_2 1 1.2 1.2.1 1.2.1.2 1.2.1.2.1