【问题标题】:If a cell contains a certain character replace the whole cell in r如果单元格包含某个字符,则替换 r 中的整个单元格
【发布时间】:2016-04-27 14:53:48
【问题描述】:

我在数据框中有几个单元格包含一个数字,后跟一个星号。我想用 NA 替换单元格中的数据。这是示例数据

a<-c(1.23,"4.2*", 5,6,"8*")
b<-c(0.01,0.5,"3.687*",9,10)
c<-data.frame(a,b)
c

我试过 c[c=="*"]

【问题讨论】:

    标签: r replace gsub


    【解决方案1】:

    尝试强制转换为数字:

    data.frame( a = as.numeric(a), b = as.numeric(b) )
    
         a     b
    1 1.23  0.01
    2   NA  0.50
    3 5.00    NA
    4 6.00  9.00
    5   NA 10.00
    

    任何无效数字都将变为 NA。 OP 首选方法的缺点是,当您似乎应该使用数字时,您最终会得到一个充满因素或字符的 data.frame。

    【讨论】:

    • 感谢您的见解,但是,我的 data.frame 更大,并且有一些包含字符的列(我意识到我没有在我的帖子中说明这一点)。当列包含我希望函数执行相同操作的字符时,请将包含 * 的任何字符替换为 NA。另一个人发布了一个可以在下面解决此问题的回复,但现在看到它已被删除。请问这个可以恢复或提供替代方案吗?
    • 这是一个重要的部分,可以省略。
    • 试试is.na(c) &lt;- sapply(c, grepl, pattern="\\*")
    • 谢谢弗兰克。另请注意,c 表示说明性数据框。如果您只是要执行 c 的解决方案,而没有将 a 和 b 作为单独的向量,则该函数将不起作用。这是我尝试过的 data.frame(as.numeric(c$a),as.numeric(c$b))。列中的数字与 a 和 b 的原始数字不匹配。
    • @Danny 那是因为你在这里玩火。当您在字符向量上使用data.frame 时——这就是示例中的ab——它们被转换为因子。因子在引擎盖下用整数编码字符串。如果您此时尝试as.numericas.integer,这些基础整数就是您所看到的。你可以使用as.numeric(as.character(c$a)) 来解决这个问题,但如果可以的话,最好避免这个问题。
    【解决方案2】:

    我们也可以使用

    c[] <- lapply(c, function(x) replace(x, grep("[*]", x), NA))
    c
    #    a    b
    #1 1.23 0.01
    #2 <NA>  0.5
    #3    5 <NA>
    #4    6    9
    #5 <NA>   10
    

    【讨论】:

    • 或者像lapply(c, function(x) type.convert(replace(as.character(x), grep("[*]", x), NA))) 这样的东西来获取数字(可能)应该在的地方。在magritrish:lapply(c, . %&gt;% as.character %&gt;% replace(grep("[*]", .), NA) %&gt;% type.convert)
    【解决方案3】:
    c[apply(c, 1:2, function(i) grepl('\\*', i))] <- NA
    c
    #     a    b
    #1 1.23 0.01
    #2 <NA>  0.5
    #3    5 <NA>
    #4    6    9
    #5 <NA>   10
    

    【讨论】:

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