替换不包含某些字符的数据帧部分

时间:2014-11-15 22:17:28

标签: r string character

我有一个数据帧(特别是一个相关矩阵)。我想用NA替换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**

我想要的是使用NA替换非sig或边缘sig关联的相同数据帧。

像这样:

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

4 个答案:

答案 0 :(得分:1)

使用否定grepl - 来电。需要使用sapply,因为没有grepl.data.frame方法。该模式是带有characer类的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**

答案 1 :(得分:0)

您也可以

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**

答案 2 :(得分:0)

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")

答案 3 :(得分:0)

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**