按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"