在 "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,但我无法将其转回数据框。
提前致谢
添加显式分隔符,以便轻松获取不同列中的数据。在这里,我在单引号中的每个单词组之后添加了逗号作为分隔符 ('....'
).
之后,使用 trimws
和 gsub
执行一些数据清理,使用 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>
我正在尝试将一列转换为多列。
这是我的例子:
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,但我无法将其转回数据框。
提前致谢
添加显式分隔符,以便轻松获取不同列中的数据。在这里,我在单引号中的每个单词组之后添加了逗号作为分隔符 ('....'
).
之后,使用 trimws
和 gsub
执行一些数据清理,使用 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>