【问题标题】:Splitting a string in R, different split argument elements在R中拆分字符串,不同的拆分参数元素
【发布时间】:2013-07-25 22:00:34
【问题描述】:

我导入了一些没有列名的数据,所以现在我只有超过一百万行和 1 列(而不是 5 列)。

每一行的格式如下:

x <- "2012-10-19T16:59:01-07:00 192.101.136.140 <190>Oct 19 2012 23:59:01: %FWSM-6-305011: Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874"

strsplit( x , split = c(" ", " ", "%", " "))

得到了

[[1]]
 [1] "2012-10-19T16:59:01-07:00"    "192.101.136.140"             
 [3] "<190>Oct"                     "19"                          
 [5] "2012"                         "23:59:01:"                   
 [7] "%FWSM-6-305011:"              "Built"                       
 [9] "dynamic"                      "tcp"                         
[11] "translation"                  "from"                        
[13] "Inside:10.2.45.62/56455"      "to"                          
[15] "outside:192.101.136.224/9874"

我知道这与回收 split 参数有关,但我似乎不知道如何获得它:

    [[1]]
     [1] "2012-10-19T16:59:01-07:00"    "192.101.136.140"             
     [3] "<190>Oct 19 2012 23:59:01     "%FWSM-6-305011
     [5] Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874"

作为第五个元素,每一行都有不同的消息,但在第四个元素之后,我只想将字符串的其余部分保持在一起。

任何帮助将不胜感激。

【问题讨论】:

  • 您似乎(错误地)认为分割向量项是按顺序应用的。
  • 这是真的。感谢您清理它

标签: r split strsplit


【解决方案1】:

您可以使用pastecollapse 参数来组合从第五个元素开始的每个元素。

A <- strsplit( x = "2012-10-19T16:59:01-07:00 192.101.136.140 <190>Oct 19 2012 23:59:01: %FWSM-6-305011: Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874", split = c(" ", " ", "%", " "))

c(A[[1]][1:4], paste(A[[1]][5:length(A[[1]])], collapse=" "))

正如@DWin 指出的那样,split = c(" ", " ", "%", " ") 没有按顺序使用 - 换句话说,它与 split = c(" ", "%") 相同

【讨论】:

  • 感谢@Senor O,这几乎成功了。最后一部分是"[3] "&lt;190&gt;Oct" [4] "19" [5] "2012 23:59:01: %FWSM-6-305011: Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874"
  • 那是因为拆分字符串的前 7 项在消息之前(与您最初所说的 4 不同)。
  • 请记住,&lt;190&gt;Oct 19 2012 23:59:01: 将被拆分为 4 项。
  • 啊,抱歉没有看到你回答的最后一部分
【解决方案2】:

我认为在这里你不需要使用strsplit。我使用read.table 来读取使用text 参数的行。然后使用paste 聚合列。由于您有很多行,最好在 data.table 内进行列聚合。

dt <- read.table(text=x)
library(data.table)
DT <- as.data.table(dt)
DT[ , c('V3','V8') := list(paste(V3,V4,V5),
      V8=paste(V8,V9,V10,V11,V12,V13,V14,V15))]
DT[,paste0('V',c(1:3,6:7,8)),with=FALSE]

                        V1              V2               V3        V6              V7
1: 2012-10-19T16:59:01-07:00 192.101.136.140 <190>Oct 19 2012 23:59:01: %FWSM-6-305011:
                                                                                           V8
1: Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874

【讨论】:

    【解决方案3】:

    这是一个我认为你认为strsplit 起作用的函数:

    split.seq<-function(x,delimiters) {
      break.point<-regexpr(delimiters[1], x)
      first<-mapply(substring,x,1,break.point-1,USE.NAMES=FALSE)
      second<-mapply(substring,x,break.point+1,nchar(x),USE.NAMES=FALSE)
      if (length(delimiters)==1)  return(lapply(1:length(first),function(x) c(first[x],second[x])))
      else mapply(function(x,y) c(x,y),first, split.seq(second, delimiters[-1]) ,USE.NAMES=FALSE, SIMPLIFY=FALSE)
    }
    
    split.seq(x,delimiters)
    

    测试:

    x<-rep(x,2)             
    delimiters=c(" ", " ", "%", " ")
    split.seq(x,delimiters)
    
    [[1]]
    [1] "2012-10-19T16:59:01-07:00"                                                                 
    [2] "192.101.136.140"                                                                           
    [3] "<190>Oct 19 2012 23:59:01: "                                                               
    [4] "FWSM-6-305011:"                                                                            
    [5] "Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874"
    
    [[2]]
    [1] "2012-10-19T16:59:01-07:00"                                                                 
    [2] "192.101.136.140"                                                                           
    [3] "<190>Oct 19 2012 23:59:01: "                                                               
    [4] "FWSM-6-305011:"                                                                            
    [5] "Built dynamic tcp translation from Inside:10.2.45.62/56455 to outside:192.101.136.224/9874"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      相关资源
      最近更新 更多