【问题标题】:Replace portions of dataframe not containing certain characters替换不包含某些字符的数据框部分
【发布时间】:2014-11-15 22:17:27
【问题描述】:

我有一个数据框(特别是相关矩阵)。我想用 NA 替换矩阵中没有“*”或“'”的任何值(即省略统计上不显着或边缘显着的单元格)。

数据是这样的:

out <- data.frame(V1=c(NA,"-0.28**","-0.18'","-0.11"),
              V2=c(NA,NA,"0.01","0.05"),
              V3=c(NA,NA,NA,"0.30**"))
rownames(out) <- c("V1","V2","V3","V4")

返回:

> out
    V1   V2     V3
V1    <NA> <NA>   <NA>
V2 -0.28** <NA>   <NA>
V3  -0.18' 0.01   <NA>
V4   -0.11 0.05 0.30**

我想要的是相同的数据框,其中非 sig 或边缘 sig 关联被替换为 NA。

像这样:

> out
    V1   V2     V3
V1    <NA> <NA>   <NA>
V2 -0.28** <NA>   <NA>
V3  -0.18' <NA>   <NA>
V4   <NA> <NA> 0.30**

【问题讨论】:

    标签: r string character


    【解决方案1】:

    使用grepl-call 的否定。需要使用 sapply 因为没有 grepl.data.frame 方法。该模式是一个带有字符类的 OR 构造。见?regex:

    > out[ !sapply( out,grepl, patt="[']|[*]") ] <- NA
    > out
            V1   V2     V3
    V1    <NA> <NA>   <NA>
    V2 -0.28** <NA>   <NA>
    V3  -0.18' <NA>   <NA>
    V4    <NA> <NA> 0.30**
    

    【讨论】:

      【解决方案2】:

      你也可以

      out[] <- lapply(out, function(x) { is.na(x) <- !grepl("[*']", x); x })
      out
      #         V1   V2     V3
      # V1    <NA> <NA>   <NA>
      # V2 -0.28** <NA>   <NA>
      # V3  -0.18' <NA>   <NA>
      # V4    <NA> <NA> 0.30**
      

      【讨论】:

        【解决方案3】:

        My "SOfun" package 有一个名为 makemeNA 的函数可以用于此目的:

        在这种情况下的用法是:

        makemeNA(out, "^[0-9.-]+$", fixed = FALSE)
        #         V1 V2     V3
        # V1    <NA> NA   <NA>
        # V2 -0.28** NA   <NA>
        # V3  -0.18' NA   <NA>
        # V4    <NA> NA 0.30**
        

        这基本上是说用NA替换任何​​只是数字(正数或负数)的东西。

        安装包:

        library(devtools)
        install_github("mrdwab/SOfun")
        

        【讨论】:

          【解决方案4】:
          out[] <- lapply(out, function(x) "is.na<-"(x, grep("^[^*']+$", x)))
          #         V1   V2     V3
          # V1    <NA> <NA>   <NA>
          # V2 -0.28** <NA>   <NA>
          # V3  -0.18' <NA>   <NA>
          # V4    <NA> <NA> 0.30**
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-22
            • 2011-12-31
            • 2018-04-08
            • 1970-01-01
            • 2014-03-27
            • 1970-01-01
            • 2019-07-21
            • 2017-08-30
            相关资源
            最近更新 更多