在 "separate" 函数中定义分隔符或使用替代方法

Define separator in "separate" function or use alternative

我正在尝试将一列转换为多列。

这是我的例子:

df <- data.frame(Id = c(1,2,3), 
                 Col2 = c("['aaa' 'aaa aaaa' 'aaa.bb']","['aaa' 'aaa aaa' 'aaa bbb ccc' 'aaa'\n]","[]"))    
df


Id   Col2

1   ['aaa' 'aaa aaaa' 'aaa.bb']         
2   ['aaa' 'aaa aaa' 'aaa bbb ccc' 'aaa'\n]         
3   []

在我的真实案例中,每次观察可以有 20 个字符串。

这将是我的预期结果:

df2 <- data.frame(Id =c(1,2,3),
             Col1 = c("aaa","aaa",NA),
             Col2 = c("aaa.aaaa","aaa.aaa",NA),
             Col3 = c("aaa.bb","aaa bbb ccc",NA),
             Col4 = c(NA,"aaa",NA))
df2


Id  Col1    Col2     Col3        Col4

1   aaa   aaa.aaaa  aaa.bb        NA
2   aaa   aaa.aaa   aaa bbb ccc  aaa
3   NA      NA       NA           NA

如何用“”分隔?

我尝试使用单独的函数,但似乎找不到“sep”的正确语法。 “分开”对我来说似乎是最好的选择,因为我使用 dplyr 来维护以前的一些专栏。

另外,请问哪里可以找到sep的使用信息呢?我在这里看到了一些例子,但我无法理解使用字符

的基本原理

我也试过 str_split,但我无法将其转回数据框。

提前致谢

添加显式分隔符,以便轻松获取不同列中的数据。在这里,我在单引号中的每个单词组之后添加了逗号作为分隔符 ('....').

之后,使用 trimwsgsub 执行一些数据清理,使用 separate_rows 逗号拆分获取长格式数据,添加一个带有 data.table::rowid 的 id 列并使用 pivot_wider.

在不同列中获取宽格式数据
library(dplyr)
library(tidyr)

df %>%
  mutate(Col2 = gsub("('.*?')", "\1,", Col2), 
         Col2 = trimws(Col2, whitespace = '\[|\]'), 
         Col2 = trimws(Col2, 'right', '[\n,]'), 
         Col2 = gsub("'", '', Col2)) %>%
  separate_rows(Col2, sep = ',\s*') %>%
  mutate(row = data.table::rowid(Id)) %>%
  pivot_wider(names_from = row, values_from = Col2, names_prefix = 'col')

#     Id col1  col2     col3        col4 
#  <dbl> <chr> <chr>    <chr>       <chr>
#1     1 "aaa" aaa aaaa aaa.bb      NA   
#2     2 "aaa" aaa aaa  aaa bbb ccc aaa  
#3     3 ""    NA       NA          NA   

你基本上得到了包含在 [] 中的带引号的字符串 'text text'。 因此,去掉 [] 并像阅读带有引号字符串的普通文本文件一样阅读它:

cbind(
  df["Id"],
  read.table(text=gsub("[][]|\n", "", df$Col2), sep=" ", quote="'",
             header=FALSE, fill=TRUE, blank.lines.skip=FALSE, na.strings="")
)
#  Id   V1       V2          V3   V4
#1  1  aaa aaa aaaa      aaa.bb <NA>
#2  2  aaa  aaa aaa aaa bbb ccc  aaa
#3  3 <NA>     <NA>        <NA> <NA>