按R中的位置匹配两个字符串 string

按R中的位置匹配两个字符串 string,r,R,很难知道您试图操作的字符串,然后在data.frame中整理为列。但是对于您发布的示例,我建议创建一个包含字符串的列表(strings): 在上面的代码中,strsplit()只要找到两个空格(\\s\\s),就会拆分字符串。但最终的拆分是一个以字符串作为内部元素的列表。因此,您需要使用unlist(),以便将其与grep()一起使用grep()将只选择那些带有字母数字字符的字符串——这正是您想要的 然后可以使用do.call(cbind,list)将结果lappy()列表中的元素绑定到列中。尺

很难知道您试图操作的字符串,然后在
data.frame中整理为列。但是对于您发布的示例,我建议创建一个包含字符串的列表(
strings
):

在上面的代码中,
strsplit()
只要找到两个空格(
\\s\\s
),就会拆分字符串。但最终的拆分是一个以字符串作为内部元素的列表。因此,您需要使用
unlist()
,以便将其与
grep()
一起使用
grep()
将只选择那些带有字母数字字符的字符串——这正是您想要的

然后可以使用
do.call(cbind,list)
将结果
lappy()
列表中的元素绑定到列中。尺寸必须与此工作相匹配

res <-lapply(strings, function(x){
  grep(x=trimws(unlist(strsplit(x, "\\s\\s"))), pattern="[[:alpha:]]", value=TRUE)
})
结果:

do.call(cbind, res)
例如,您可以将其包装成
as.data.frame()
以获得所需的结果:

> do.call(cbind, res)
     [,1] [,2]       
[1,] "A"  "I love"   
[2,] "B"  "chocolate"
[3,] "C"  "pudding"  

您可以使用
read.fwf
并使用
nchar
获取位置

> as.data.frame(do.call(cbind, res), stringsAsFactors = FALSE)
  V1        V2
1  A    I love
2  B chocolate
3  C   pudding
如果需要删除空白,请同时使用
trimws

read.fwf(file=textConnection(text),
 widths=c(diff(c(1, gregexpr("\\w", string)[[1]])), nchar(text)))[-1]
#         V2                 V3      V4
#1 I love    chocolate          pudding

根据您的数据,我使用软件包stringr提出了这个解决方案。这只适用于这种模式,所以如果您有不稳定的模式,您需要调整它

输出是一个
data.frame
,由两个输入数据和行根据匹配项给出两列

库(stringr)

字符串是否都是你的
文本的
s4个单词长,或者它们是否不同?对于C和“pudding”的初始字符位置不相同的情况,你有什么建议吗?(例如,C位于第23位,布丁从20开始,C与“丁”匹配,B与“巧克力布丁”匹配)可能会针对这种情况提出新问题,因为给定的解决方案不容易适应这种新情况。
> as.data.frame(do.call(cbind, res), stringsAsFactors = FALSE)
  V1        V2
1  A    I love
2  B chocolate
3  C   pudding
read.fwf(file=textConnection(text),
 widths=c(diff(c(1, gregexpr("\\w", string)[[1]])), nchar(text)))[-1]
#         V2                 V3      V4
#1 I love    chocolate          pudding
trimws(read.fwf(file=textConnection(text),
 widths=c(diff(c(1, gregexpr("\\w", string)[[1]])), nchar(text)))[-1])
#[1] "I love"    "chocolate" "pudding"