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