R 从列表中的任何字符拆分字符串

R 从列表中的任何字符拆分字符串,r,string,R,String,对于底层代码是否有更优雅的解决方案?基本上,我想在字符向量上进行strsplit。我想知道是否有更好的解决方案,例如使用%in%或其他方法 data_d <- data.frame(id = c('A', 'B', 'C'), sentence = c('1. this is A sentence', '2. this is B sentence',

对于底层代码是否有更优雅的解决方案?基本上,我想在字符向量上进行strsplit。我想知道是否有更好的解决方案,例如使用%in%或其他方法

data_d <- data.frame(id = c('A', 'B', 'C'),
                     sentence = c('1. this is A sentence',
                                  '2. this is B sentence',
                                  '3. this is C sentence'),
                     stringsAsFactors = F)
listasd <- c('A', 'B', 'C')
data_d$first <- NA
for (i in listasd)
  data_d$first <-  ifelse(str_detect(data_d$sentence, i),
                          sapply(strsplit(data_d$sentence, i), "[", 1),
                          data_d$first)

data\u d这提供了相同的输出:

sapply(strsplit(data_d$sentence, c('A','B','C')),'[',1)
# [1] "1. this is " "2. this is " "3. this is "
根据
?split
split
参数可以采用字符向量,这些字符向量沿着
x
循环使用

如果您尝试:

sapply(strsplit(data_d$sentence, c('C','B','A')),'[',1)
# "1. this is A sentence" "2. this is "           "3. this is C sentence"

仍然有效,因为在第一个和第三个字符串中没有可拆分的内容。

您可以使用
gsub
。正则表达式从大写字母到行尾查找。如果你的句子中有其他大写字母,你需要调整它

data_d$first <- gsub('[A-Z].*$', '', data_d$sentence)

> data_d
  id              sentence       first
1  A 1. this is A sentence 1. this is 
2  B 2. this is B sentence 2. this is 
3  C 3. this is C sentence 3. this is 
data\u d$第一个数据
先确认一句话
一个一个。这是第一句话。这是
2 B 2。这是第二句。这是
3 C 3。这是C的第三句。这是

< /代码>

可以考虑使用<代码> Strugi包> < /P> 因此,也许有一个更优雅的解决方案:

listasd <- c('C', 'A', 'B')
stri_split_regex(data_d$sentence, stri_paste(listasd, collapse="|"), n=2, simplify = TRUE)[,1]
因此,您可以创建一个没有循环的解决方案,这在R中非常慢:

data_d$first <- stri_split_regex(data_d$sentence, stri_paste(listasd, collapse="|"), n=2, simplify = TRUE)[,1]

data\u d$first调整它意味着什么?如果句子中有标题、案例等复杂的句子怎么办?我对向量中包含的字符更感兴趣。好吧,如果你的任何句子有不止一个大写字母,所有这些方法都会有问题。如果你只想寻找一个大写字母,你可以用
sapply(data_d$id,function(x){gsub(paste0(x,'.*$),'',data_d[data_d$id==x,'statement'])循环这个方法。
,但是这失去了矢量化的好处,而且没有其他答案那么优雅。奇怪。这适用于单个字母,但如果列表包含2个或更多大写字母,则似乎不起作用这不再是很好的工作了。不确定你的意思,因为它产生了预期的输出,它就不再工作了。请看更新的答案。DATAYD $$USER4040706在编辑之后请考虑。现在使用ReGEX版本,ReXEX创建。
data_d$first <- stri_split_regex(data_d$sentence, stri_paste(listasd, collapse="|"), n=2, simplify = TRUE)[,1]