我有一个文本值向量,类似于:
Col1
camel; cow; giraffe; panda; zebra
camel; giraffe; zebra
panda; zebra
我想把这些值分成相等数量的列,这样这些值就会在相同的列中垂直对齐,而NA则有空白,这样我就得到:
Col1, Col2, Col3, Col4, Col5
camel, cow, giraffe, panda, zebra
camel, NA, giraffe, NA, zebra
NA, NA, NA, panda, zebra
我怎样才能做到这一点?我试过使用"分离"功能在dplyr,但这会返回错误信息,而使用"分裂"功能在splitshapestack允许我分开列,但他们不返回垂直对齐的值。我也尝试过以类似的方式使用'lapply'和'match',但再次,我不断得到错误信息。
您可以多次调整您的数据来对齐这些值:
library(dplyr)
df %>%
tibble::rowid_to_column("id") %>%
tidyr::separate_rows(Col1, sep = "; ") %>%
tidyr::pivot_wider(id_cols = id,
names_from = Col1,
values_from = Col1) %>%
dplyr::select(-id) %>%
magrittr::set_colnames(paste0("Col", 1:ncol(.)))
输出Col1 Col2 Col3 Col4 Col5
<chr> <chr> <chr> <chr> <chr>
1 camel cow giraffe panda zebra
2 camel NA giraffe NA zebra
3 NA NA NA panda zebra
工作原理
rowid_to_column
跟踪行号,因此当数据转向更长的格式时,我们不会丢失哪些值属于哪些行。separate_rows
将分离Col1
并将数据枢轴转换为较长的格式。@Adam建议pivot_wider
将所有内容对齐到指定的列中。
数据
structure(list(Col1 = c("camel; cow; giraffe; panda; zebra",
"camel; giraffe; zebra", "panda; zebra")), class = "data.frame", row.names = c(NA,
-3L))