【问题标题】:Split a string vector at whitespace在空格处拆分字符串向量
【发布时间】:2010-12-13 05:10:57
【问题描述】:

我有以下向量:

tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
"1530 1", "1540 2", "1540 1")

我想只保留这个向量的每个原子中的第二个数字,所以它会显示为:

c(2,1,2,1,2,1,2,1,2,1)

【问题讨论】:

  • 您能否接受一个答案以将问题标记为已解决?

标签: r string vector split whitespace


【解决方案1】:

可能有更好的方法,但这里有两种方法 strsplit()

as.numeric(data.frame(strsplit(tmp3, " "))[2,])
as.numeric(lapply(strsplit(tmp3," "), function(x) x[2]))

如果您可以使用字符,则可能不需要 as.numeric()...

【讨论】:

  • 这是一个优雅的解决方案。正是我想要的。谢谢!
  • 我尝试使用您的解决方案,但是使用数据框的列并没有立即工作。我会补充一点,对于那些你需要把它变成一个列表的情况。 as.numeric(data.frame(strsplit(as.list(df$columnx), " "))[2,])
【解决方案2】:
substr(x = tmp3, start = 6, stop = 6)

只要你的字符串总是相同的长度,这应该可以解决问题。

(当然,您不必指定参数名称 - substr(tmp3, 6, 6) 也可以正常工作)

【讨论】:

    【解决方案3】:

    可以在textConnection 上使用read.table

    X <- read.table(textConnection(tmp3))
    

    然后

    > str(X)
    'data.frame':   10 obs. of  2 variables:
     $ V1: int  1500 1500 1510 1510 1520 1520 1530 1530 1540 1540
     $ V2: int  2 1 2 1 2 1 2 1 2 1
    

    所以X$V2 是您所需要的。

    【讨论】:

      【解决方案4】:

      应该这样做:

      library(plyr)
      ldply(strsplit(tmp3, split = " "))[[2]]
      

      如果需要数值向量,请使用

      as.numeric(ldply(strsplit(tmp3, split = " "))[[2]])
      

      【讨论】:

        【解决方案5】:

        我认为最优雅的方式是这样做

        >     res <- sapply(strsplit(tmp3, " "), "[[", 2)
        

        如果你需要它是一个整数

        >     storage.mode(res) <- "integer"
        

        【讨论】:

        • 另外,res &lt;- as.numeric(sapply(...)) 也可以; storage.mode有点吓人
        【解决方案6】:

        通过 data.table 将 1 列拆分为 2 列的更简单方法

        require(data.table)  
        data_ex = data.table( a = paste( sample(1:3, size=10, replace=TRUE),"-separate", sep="" ))  
        data_ex[, number:=  unlist( strsplit(x=a, split="-") )[[1]], by=a]  
        data_ex[, word:= unlist( strsplit(x=a, split="-") )[[2]], by=a ]
        

        【讨论】:

          【解决方案7】:

          这在一定程度上取决于您的实际数据与您提供的示例数据的匹配程度。我你只是想得到空间之后的一切,你可以使用gsub

          gsub(".+\\s+", "", tmp3)
          [1] "2" "1" "2" "1" "2" "1" "2" "1" "2" "1"
          

          如果您尝试实现比“在空格后取所有内容”更复杂的规则,则需要更复杂的正则表达式。

          【讨论】:

          • 你能解释一下吗……
          • 函数gsub 用于将正则表达式匹配替换为其他内容。在这种情况下,我们使用正则表达式.+\\s+ 并将找到的任何匹配项替换为空字符串""。正则表达式翻译为“在开头匹配任何内容,但必须以空格结尾”(字符空格写为\\s
          【解决方案8】:

          另一个选项是scan()。要获得第二个值,我们可以使用逻辑子集。

          scan(text = tmp3)[c(FALSE, TRUE)]
          #  [1] 2 1 2 1 2 1 2 1 2 1
          

          【讨论】:

            【解决方案9】:

            只需添加两个选项 - 使用 stringr::str_split()data.table::tstrsplit()

            1) 使用stringr::str_split()

            # data posted above by the asker
            tmp3 <- c("1500 2", "1500 1", "1510 2", "1510 1", "1520 2", "1520 1", "1530 2", 
                      "1530 1", "1540 2", "1540 1")
            
            library(stringr)
            
            as.integer(
              str_split(string = tmp3, 
                        pattern = "[[:space:]]", 
                        simplify = TRUE)[, 2] 
            )
            #>  [1] 2 1 2 1 2 1 2 1 2 1
            

            simplify = TRUE 告诉str_split 返回一个矩阵,然后我们可以为所需列索引矩阵,因此,[, 2] 部分

            2) 使用data.table::tstrsplit()

            library(data.table)
            
            as.data.table(tmp3)[, tstrsplit(tmp3, split = "[[:space:]]", type.convert = TRUE)][, V2]
            #>  [1] 2 1 2 1 2 1 2 1 2 1
            

            type.convert = TRUE 负责此处转换为整数,但请谨慎使用其他数据集。 索引[, V2] 部分的原因与上面对[, 2] 的解释类似。在这里,它选择返回的数据表对象的第二列,其中包含询问者所需的整数值。

            sessionInfo()
            #> R version 4.0.0 (2020-04-24)
            #> Platform: x86_64-w64-mingw32/x64 (64-bit)
            #> Running under: Windows 10 x64 (build 18362)
            #> 
            #> Matrix products: default
            #> 
            #> locale:
            #> [1] LC_COLLATE=English_United States.1252 
            #> [2] LC_CTYPE=English_United States.1252   
            #> [3] LC_MONETARY=English_United States.1252
            #> [4] LC_NUMERIC=C                          
            #> [5] LC_TIME=English_United States.1252    
            #> 
            #> attached base packages:
            #> [1] stats     graphics  grDevices utils     datasets  methods   base     
            #> 
            #> loaded via a namespace (and not attached):
            #>  [1] compiler_4.0.0  magrittr_1.5    tools_4.0.0     htmltools_0.4.0
            #>  [5] yaml_2.2.1      Rcpp_1.0.4.6    stringi_1.4.6   rmarkdown_2.1  
            #>  [9] highr_0.8       knitr_1.28      stringr_1.4.0   xfun_0.13      
            #> [13] digest_0.6.25   rlang_0.4.6     evaluate_0.14
            

            reprex package (v0.3.0) 于 2020 年 5 月 6 日创建

            【讨论】:

              猜你喜欢
              • 2013-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-08
              • 1970-01-01
              • 1970-01-01
              • 2013-04-19
              • 1970-01-01
              相关资源
              最近更新 更多