R拆分由不同数量的空格分隔的字符列
我有一个数据框,其中有一列由不同数量的空格分隔的单词组成,例如:R拆分由不同数量的空格分隔的字符列,r,split,R,Split,我有一个数据框,其中有一列由不同数量的空格分隔的单词组成,例如: head(lst) 'fff fffd ddd' 'sss dd' 'de dd' 'dds sssd eew rrr' 'dsds eed' 我想要的是两列: 第一列是第一个空格之前的部分 第二列是最后一个空格后的部分 意思应该是这样 V1 v2 'fff' 'ddd' 'sss' 'dd' 'de' 'dd' 'dds' 'rrr 'dsds' 'eed' 我能得到第一列,但第二列是个问题
head(lst)
'fff fffd ddd'
'sss dd'
'de dd'
'dds sssd eew rrr'
'dsds eed'
我想要的是两列:
第一列是第一个空格之前的部分
第二列是最后一个空格后的部分
意思应该是这样
V1 v2
'fff' 'ddd'
'sss' 'dd'
'de' 'dd'
'dds' 'rrr
'dsds' 'eed'
我能得到第一列,但第二列是个问题
这是我使用的代码
lst <- strsplit(athletes.df$V1, "\\s+")
v1 <- sapply(lst ,`[`, 1)
v2 <- sapply(lst, `[`, 2)
lst也许是这个
lst <- strsplit(athletes.df$V1, "\\s+")
v1 <- sapply(lst ,`[`, 1)
v2 <- sapply(lst, function(x) x[length(x)])
也许是这个
lst <- strsplit(athletes.df$V1, "\\s+")
v1 <- sapply(lst ,`[`, 1)
v2 <- sapply(lst, function(x) x[length(x)])
您可以使用tail
获取每个向量的最后一个条目:
lst <- strsplit(athletes.df$V1, "\\s+")
v1 <- sapply(lst, head, 1) # example with head to grab first vector element
v2 <- sapply(lst, tail, 1) # example with tail to grab last vector element
另一种方法是将您的strsplit
split标准修改为类似这样的内容,即您可以在一个空格上拆分,该空格可以选择后跟任意字符一次或多次,直到找到最终空格
strsplit(df$V1, "\\s(?:.+\\s)?")
#[[1]]
#[1] "fff" "ddd"
#
#[[2]]
#[1] "sss" "dd"
#
#[[3]]
#[1] "de" "dd"
#
#[[4]]
#[1] "dds" "rrr"
#
#[[5]]
#[1] "dsds" "eed"
正如Sumedh指出的,这个正则表达式与tidyr
的separate
配合得很好:
tidyr::separate(df, V1, c("V1", "V2"), "\\s(?:.+\\s)?")
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
两种基于stringi的方法:
library(stringi)
v1 <- stri_extract_last_regex(df$V1, "\\S+")
v2 <- stri_extract_first_regex(df$V1, "\\S+")
库(stringi)
v1您可以使用tail
获取每个向量的最后一个条目:
lst <- strsplit(athletes.df$V1, "\\s+")
v1 <- sapply(lst, head, 1) # example with head to grab first vector element
v2 <- sapply(lst, tail, 1) # example with tail to grab last vector element
另一种方法是将您的strsplit
split标准修改为类似这样的内容,即您可以在一个空格上拆分,该空格可以选择后跟任意字符一次或多次,直到找到最终空格
strsplit(df$V1, "\\s(?:.+\\s)?")
#[[1]]
#[1] "fff" "ddd"
#
#[[2]]
#[1] "sss" "dd"
#
#[[3]]
#[1] "de" "dd"
#
#[[4]]
#[1] "dds" "rrr"
#
#[[5]]
#[1] "dsds" "eed"
正如Sumedh指出的,这个正则表达式与tidyr
的separate
配合得很好:
tidyr::separate(df, V1, c("V1", "V2"), "\\s(?:.+\\s)?")
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
两种基于stringi的方法:
library(stringi)
v1 <- stri_extract_last_regex(df$V1, "\\S+")
v2 <- stri_extract_first_regex(df$V1, "\\S+")
库(stringi)
v1在不使用任何软件包的情况下,在使用sub
创建分隔符后,可以使用read.table
执行此操作
read.table(text=sub("^(\\S+)\\s+.*\\s+(\\S+)$", "\\1 \\2", df1$V1),
header=FALSE, stringsAsFactors= FALSE)
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
另一个方便的选项是word
fromstringr
library(stringr)
transform(df1, V1 = word(V1, 1), V2 = word(V1, -1))
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
数据
df1在不使用任何软件包的情况下,在使用sub
创建分隔符后,可以使用read.table
完成此操作
read.table(text=sub("^(\\S+)\\s+.*\\s+(\\S+)$", "\\1 \\2", df1$V1),
header=FALSE, stringsAsFactors= FALSE)
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
另一个方便的选项是word
fromstringr
library(stringr)
transform(df1, V1 = word(V1, 1), V2 = word(V1, -1))
# V1 V2
#1 fff ddd
#2 sss dd
#3 de dd
#4 dds rrr
#5 dsds eed
数据
df1正则表达式太棒了!也许您可以添加tidyr::separate(df,V1,c(“V1”,“V2”),“\\s(?:。+\\s)?”
?正则表达式真是太棒了!也许您可以添加tidyr::separate(df,V1,c(“V1”,“V2”),“\\s(?:。+\\s)?”)
?