【发布时间】:2021-12-02 17:51:11
【问题描述】:
我有一个文本列,我想将其数字分成列:
df <- structure(list(text = c("((i: DH=0, SZ=0, RM=0, FO=0, GP=0, BC=0))",
"((i: DH=0, SZ=0, RM=0, FO=0, GP=0, BC=0))", "((i: DH=1, SZ=0, RM=0, FO=NA, GP=0, BC=0))",
"((i: DH=1, SZ=0, RM=NA, FO=0, GP=0, BC=0))", "((i: DH=1, SZ=1, RM=0, FO=0, GP=0, BC=0))",
"((i: DH=0, SZ=1, RM=0, FO=0, GP=0, BC=0))", "((i: DH=0, SZ=0, RM=1, FO=0, GP=0, BC=1))",
"((i: DH=0, SZ=1, RM=0, FO=0, GP=0, BC=0))", "((i: DH=0, SZ=1, RM=0, FO=0, GP=0, BC=0))",
"((i: DH=0, SZ=1, RM=0, FO=1, GP=0, BC=0))", "((i: DH=0, SZ=1, RM=0, FO=0, GP=0, BC=1))",
"((i: DH=0, SZ=NA, RM=0, FO=0, GP=0, BC=0))", "((i: DH=0, SZ=0, RM=0, FO=0, GP=0, BC=0))"
)), row.names = c(NA, -13L), class = "data.frame")
我可以 str_extractthe 数字,但无法使用 tidyr 的函数 separate 将数字分成数字列:
library(stringr)
library(tidyr)
library(dplyr)
df %>%
mutate(text = str_extract_all(text,"(?<==)\\d|NA(?=,)")) %>%
separate(col = text,
into = c("DH", "SZ", "RM", "FO", "GP", "BC"),
sep = ", ",
convert = TRUE)
DH SZ RM FO GP BC
1 c("0" "0" "0" "0" "0" "0")
2 c("0" "0" "0" "0" "0" "0")
3 c("1" "0" "0" "NA" "0" "0")
4 c("1" "0" "NA" "0" "0" "0")
5 c("1" "1" "0" "0" "0" "0")
6 c("0" "1" "0" "0" "0" "0")
7 c("0" "0" "1" "0" "0" "1")
8 c("0" "1" "0" "0" "0" "0")
9 c("0" "1" "0" "0" "0" "0")
10 c("0" "1" "0" "1" "0" "0")
11 c("0" "1" "0" "0" "0" "1")
12 c("0" "NA" "0" "0" "0" "0")
13 c("0" "0" "0" "0" "0" "0")
我的直觉是,这是因为str_extract_all 返回 列表 中的数字,而 separate 不适用于列表。这里有什么解决办法?
【问题讨论】:
-
作为替代方案,您可以使用
readr::read_csv(I(gsub("[^0-9,]", "", df$text)), col_names = c("DH", "SZ", "RM", "FO", "GP", "BC"), show_col_types = FALSE)。