我一直在努力,我想知道是否有一个简单的解决方法.对于某些情况,我发现考虑对矩阵进行子集化更合乎逻辑
N <- 12
N.NA <- 6
dat <- data.frame(V1=runif(N),V2=runif(N))
sel.mat <- matrix(c(sample(seq(N),N.NA),sample(ncol(dat),N.NA,replace=TRUE)),ncol=2)
Run Code Online (Sandbox Code Playgroud)
这适用于选择,但不适用于替换:
> dat[sel.mat]
[1] 0.2582569 0.8455966 0.8828083 0.5384263 0.9574810 0.5623158
> dat[sel.mat] <- NA
Error in `[<-.data.frame`(`*tmp*`, sel.mat, value = NA) :
only logical matrix subscripts are allowed in replacement
Run Code Online (Sandbox Code Playgroud)
我意识到错误消息是有原因的(如果你有多个替换指向同一个元素,它就不知道该怎么办),但这并不能阻止R允许对矢量进行整数替换(例如dat$V1[c(2,3)] <- NA).
有没有一种方便的方法允许用整数矩阵替换?
将其转换为矩阵:
dat.m <- as.matrix(dat)
dat.m[sel.mat] <- NA
> dat.m
V1 V2
[1,] 0.2539189 NA
[2,] 0.5216975 NA
[3,] 0.1206138 0.14714848
[4,] 0.2841779 0.52352209
[5,] 0.3965337 NA
[6,] 0.1871074 0.23747235
[7,] 0.2991774 NA
[8,] NA 0.09509202
[9,] 0.4636460 0.59384430
[10,] 0.5493738 0.92334630
[11,] 0.7160894 NA
[12,] 0.9568567 0.80398264
Run Code Online (Sandbox Code Playgroud)
编辑解释为什么我们有data.frame错误
dat.m[sel.mat] <- NA
Run Code Online (Sandbox Code Playgroud)
等同于执行以下操作:
temp <- dat
dat <- "[<-"(temp, sel.mat, value=NA)
Error in `[<-.data.frame`(temp, sel.mat, value = NA) :
only logical matrix subscripts are allowed in replacement
Run Code Online (Sandbox Code Playgroud)
现在我可以做以下事情并且它有效:
dat <- "[<-"(as.matrix(temp), sel.mat, value=NA)
Run Code Online (Sandbox Code Playgroud)
您可以基于整数矩阵创建逻辑矩阵:
log.mat <- matrix(FALSE, nrow(dat), ncol(dat))
log.mat[sel.mat] <- TRUE
Run Code Online (Sandbox Code Playgroud)
此矩阵可用于替换数据框中的NA值(或其他值):
is.na(dat) <- log.mat
Run Code Online (Sandbox Code Playgroud)
结果:
V1 V2
1 0.76063534 NA
2 0.27713051 0.10593451
3 0.74301263 0.77689458
4 0.42202155 NA
5 0.54563816 0.10233017
6 NA 0.05818723
7 0.83531963 0.93805113
8 0.99316128 0.61505393
9 0.08743757 NA
10 0.95510231 0.51267338
11 0.14035257 NA
12 0.59408022 NA
Run Code Online (Sandbox Code Playgroud)
这允许您将原始对象保留为允许不同类型列的数据框.
FWIW,带有替换的矩阵索引确实可以在当前快照中工作R-devel(并且将成为 的一部分R-3.0.0)。显然R-core中有人和你有同样的愿望。
如R-devel NEWS 文件中所述:
现在支持通过两列数字索引对数据帧进行矩阵索引以进行替换和提取。
演示:
dat[sel.mat]
## [1] 0.3355509 0.4114056 0.2334332 0.6597042 0.7707762 0.7783584
dat[sel.mat] <- NA
dat[sel.mat]
## [1] NA NA NA NA NA NA
R.version.string
# [1] "R Under development (unstable) (2012-12-29 r61478)"
Run Code Online (Sandbox Code Playgroud)