繁体   English   中英

将两个子模式上的字符串拆分为data.frame

[英]Split string on two subpatterns into data.frame

我有一个字符向量:

s <- "0 / 10 %(% 1 / 11 %-% 2 / 12 %)% 3 / 13"

目标是将它和/%*%分成(x,y)点和z符号:

data.frame(x = c(0,1,2,3), y = c(10,11,12,13), z = c("(", "-", ")", NA),
           stringsAsFactors = FALSE)
  x  y    z
1 0 10    (
2 1 11    -
3 2 12    )
4 3 13 <NA>

笔记:

  • /分开点:我想将x / y分成x -part和y -part。
  • 第二个分割%*%应该进入符号列z ,但没有% 's;

我尝试了各种版本的strsplit没有成功:

trimws(unlist(strsplit(s, "[/(%*%)]")))
[1] "0" "0" ""  ""  "1" "1" "-" "2" "2" ""  ""  "3" "3"

问题

  • -不会被(%*%)抓住,为什么?
  • 我有空字符串部分,为什么?
  • 我不知道如何将split存储到z列中

这解决了您的问题:


str <- "0 / 10 %(% 1 / 11 %-% 2 / 12 %)% 3 / 13"

str_sub <- gsub("[%/]","",str) #sub all % and / with ""
str_split <- strsplit(str_sub,"\\s+")[[1]] #split by whitespace
str_corr <- c(str_split,rep(NA,3-length(str_split) %% 3)) #correct length, fill the end with NAs

df <- as.data.frame(matrix(str_corr,ncol=3,byrow=TRUE)) #convert to data.frame via matrix
colnames(df) <- c("x","y","z") #set colnames

reprex包创建于2019-04-09(v0.2.1)

到你的第一期:

  1. %*%不捕获-因为你要求正则表达式重复% 0或更多次(使用*)但不要求-

这是微妙的,因为strsplit(s, '%[(-)]%')抛弃了你的分裂模式,这对于'/'是可以的,但不是用于捕获strsplit(s, '%[(-)]%')间的中间字符。 如果你保证在正确的百分比之后有空格,你可以做strsplit(s,'%'); 否则你需要一个带有右前瞻数字断言的正则表达式。

进行两次拆分更容易,更清晰:对'%'右边百分比进行第一次拆分:

s2 <- strsplit(s, '% ')[[1]]

"0 / 10 %(" "1 / 11 %-" "2 / 12 %)" "3 / 13"

现在,您对'/'和左百分比字符进行第二次拆分:

> strsplit(s2, '[%/]')

[[1]]
[1] "0 "   " 10 " "("   

[[2]]
[1] "1 "   " 11 " "-"   

[[3]]
[1] "2 "   " 12 " ")"   

[[4]]
[1] "3 "  " 13"

这个问题很轻微; 最后一行没有符号。 因为在你的情况下似乎可以安全地假设只发生在行尾,最简单的kludge是添加'%$%'行尾字符(注意尾随空格),然后映射$ - > NA。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM