Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R拆分由不同数量的空格分隔的字符列_R_Split - Fatal编程技术网

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
from
stringr

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
from
stringr

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)?”)