【问题标题】:R: Removing Whitespace + DelimiterR:删除空格+分隔符
【发布时间】:2014-10-21 01:17:56
【问题描述】:

我对 R 语言相当陌生。所以我有这个向量包含以下内容:

> head(sampleVector)

[1] "| txt01 |   100 |         200 |       123.456 |           0.12345 |"
[2] "| txt02 |   300 |         400 |       789.012 |           0.06789 |"

我想提取线条并将每个线条分成单独的部分,每个部分都有一个数据值。 我想得到一个列表resultList最终会打印出以下内容:

> head(resultList)`

[[1]]`  
[1] ""   "txt01"    "100"       "200"     "123.456"        "0.12345" 

[[2]]`  
[1] ""   "txt02"    "300"       "400"     "789.012"        "0.06789"

我正在努力使用strsplit() 表示法,到目前为止我已经尝试并获得了以下代码:

resultList  <- strsplit(sampleVector,"\\s+[|] | [|]\\s+ | [\\s+]")`          
#would give me the following output`

# [[1]]`    
# [1] "| txt01"    "100"       "200"     "123.456"        "0.12345 |" 

无论如何我可以得到strsplit 调用的输出?我猜我区分分隔符+空格的符号是错误的。对此有任何帮助都会很好。

【问题讨论】:

    标签: r delimiter strsplit


    【解决方案1】:

    另一个我几乎错过的strsplit 选项:

    strsplit(test,"[| ]+")
    #[[1]]
    #[1] ""        "txt01"   "100"     "200"     "123.456" "0.12345"
    # 
    #[[2]]
    #[1] ""        "txt02"   "300"     "400"     "789.012" "0.06789"
    

    ...和我原来的答案,因为 regmatches 是我最近最喜欢的功能:

    regmatches(test,gregexpr("[^| ]+",test))
    #[[1]]
    #[1] "txt01"   "100"     "200"     "123.456" "0.12345"
    #
    #[[2]]
    #[1] "txt02"   "300"     "400"     "789.012" "0.06789"
    

    按要求分解:

    [| ]+ 是搜索单个或重复实例 + 的空格 或管道 |
    [^| ]+ 是搜索单个或重复实例的正则表达式 + 的任何字符不是 ^ 空格 或管道 |
    gregexpr 查找此模式的所有实例并返回匹配模式的起始位置和长度。
    regmatches 提取所有test 中与 gregexpr 匹配的模式

    【讨论】:

    • 哦,当然。带着所有花哨的东西来。
    • @RichardScriven - 我确实喜欢尝试另一种选择 ;-)
    • 你看到我的scan 替代方案了吗?跳出框框思考
    • @RichardScriven - scan 很简洁 - 你也可以用 read.table 编造一些东西。
    • strsplit 解决方案是银行里的钱。 @MagnumOpus - 我认为你应该接受这个答案
    【解决方案2】:

    这是一种方法。这首先从带有gsub 的向量中删除|。然后它在空格(或任意数量的空格)上使用strsplit。这样可能会更容易一些。

    strsplit(gsub("|", "", sampleVector, fixed=TRUE), "\\s+")
    # [[1]]
    # [1] ""        "txt01"   "100"     "200"     "123.456" "0.12345"
    #
    # [[2]]
    # [1] ""        "txt02"   "300"     "400"     "789.012" "0.06789"
    

    这是一个使用scan 的有趣替代方案,它可能很有用,而且可能会很快。

    lapply(sampleVector, function(y) {
        s <- scan(text = y, what = character(), sep = "|", quiet = TRUE)
        (g <- gsub("\\s+", "", s))[-length(g)]
    })
    # [[1]]
    # [1] ""        "txt01"   "100"     "200"     "123.456" "0.12345"
    #
    # [[2]]
    # [1] ""        "txt02"   "300"     "400"     "789.012" "0.06789"
    

    【讨论】:

    • 哇,谢谢伙计。我正在研究gsub,但我没想过将它放在strsplit 函数中。谢谢。将接受作为答案(在大约 6 分钟内,当 SO 也允许我时)啊哈哈哈再次感谢您的帮助 P.S.我希望我能投票赞成这个啊哈哈哈
    • 不用担心。我真的很喜欢这些类型的问题:)。此外,不确定是否要保留第一个 "" 元素。使用lapply(resultList, "[", -1) 可以轻松删除它
    • ahahahahha 我已经掌握了窍门。我不熟悉类似于\\s 的符号。再次感谢。祝SF巨人好运:)
    • 啊,我稍后在进行矩阵操作时会需要它,但我会记住这一点。
    【解决方案3】:

    可以先试试strsplit,再试试gsub:

    sapply(strsplit(xx, '\\|'), function (x) gsub("^\\s+|\\s+$", "", x))
         [,1]     
    [1,] ""       
    [2,] "txt01"  
    [3,] "100"    
    [4,] "200"    
    [5,] "123.456"
    [6,] "0.12345"
    

    【讨论】:

    • 我想返回一个列表,其中每个列表组件都包含拆分字符。不过还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 2019-09-26
    • 1970-01-01
    相关资源
    最近更新 更多