【问题标题】:Find and replace text in matrix查找和替换矩阵中的文本
【发布时间】:2014-01-15 12:46:04
【问题描述】:

我有一个字符矩阵,其中填充了以下一般格式的值:A/-A/BI/A/A//A-/BA/B/C、@ 987654330@.

我需要清理这个数据集,所以剩下的就是遵循A/B 格式的值,换句话说,两个由正斜杠分隔的单个字符。任何包含-I、多个正斜杠、一个没有字母的正斜杠或一个只有一个字母的正斜杠都必须替换为空格“”。

我已经尝试过多次迭代gsub() 来用“”替换任何不符合正确格式的值。

这是我发现的最接近的对我有意义的值,但它只删除了包含 -I、多个正斜杠和一个正斜杠(没有周围的字母)的值。剩下的数据格式为A/B(我要保留的那个)、A//B(其他需要替换的):

    data.matrix = as.matrix(data)
    data.matrix.clean = gsub("/./|^/.|./$|^/$|-|I", "", data.matrix)

也许我应该用不同的方式写这个而不用|分隔我的每个独立标准?根据我的阅读,^ 表示字符串的开头,$ 表示字符串的结尾。它似乎适用于 ^/$ 案例,但不适用于 ^/../$ 案例,我不知道为什么。

在我尝试了一些新的东西之后,我检查了所有包含值的正斜杠的格式,使用这个似乎可以正常工作的代码。

slash = grep("/", data.matrix.clean)
slash.t = data.matrix.clean[slash]
table(slash.t)

任何有助于更好地理解gsub() 中可以使用的符号以使其正常工作的帮助将不胜感激。

谢谢!

【问题讨论】:

  • 我已经从标题as per the guideline中删除了标签。
  • 你想保留"A/B/C"吗?
  • 不,我不想保留 A/B/C。现在尝试一些建议。

标签: regex string r replace gsub


【解决方案1】:

只需使用grepl 并替换其余部分:

conforming = grepl('^(?!I)\\w/(?!I)\\w$', matrix, perl = TRUE)
matrix[! conforming] = ""

字面意思是:

字符串以一个字符开头(I 除外),后跟一个斜线和一个字符(I 除外)并在此处结束。

【讨论】:

    【解决方案2】:

    你需要量词*任意数量)来替换整个字符串:

    data.matrix <- matrix(c("A/-", "A/B", "I/A", "/", "A/", "/A", 
                            "-/B", "A/B/C", "A/-/C"), ncol = 3)
    
         [,1]  [,2] [,3]   
    [1,] "A/-" "/"  "-/B"  
    [2,] "A/B" "A/" "A/B/C"
    [3,] "I/A" "/A" "A/-/C"
    
    
    sub(".*/.*/.*|^/.*|.*/$|^/$|.*-.*|.*I.*", "", data.matrix)
    
         [,1]  [,2] [,3]
    [1,] ""    ""   ""  
    [2,] "A/B" ""   ""  
    [3,] ""    ""   ""  
    

    【讨论】:

    • 谢谢,这完全符合我的需要。我之前尝试过包含“*”的变体,但它们对我来说从来没有完全奏效。谢谢!
    猜你喜欢
    • 2012-10-25
    • 2014-09-19
    • 2017-09-12
    • 2011-08-20
    • 2011-11-24
    • 2021-10-25
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多