1

我正在尝试遍历数据框的每一行,随机选择一半变量,并将该特定行的变量设置为NA.

例如,对于mydf下面的数据集,我希望我的第一行随机选择 3 个变量(例如QBQEQF)并将它们的分数设置为NA,然后再次为第二行(例如QAQDQE)等等:

library(tibble)
mydf <- tibble(QA = rnorm(100),
QB = rnorm(100), 
QC = rnorm(100), 
QD = rnorm(100), 
QE = rnorm(100), 
QF = rnorm(100))

我的尝试,但它似乎没有做任何事情:

vars <- names(mydf)
for (i in nrow(mydf)){
  miss_vars <- sample(vars, 3)
  for (j in miss_vars) {
     mydf[i,j] <- NA
#mydf[i,][[j]] <- NA #Also tried this.
   }
}
4

2 回答 2

1

本来应该:

for (i in seq_len(nrow(mydf))){
  miss_vars <- sample(vars, 3)
  for (j in miss_vars) {
    mydf[i,][[j]] <- NA
  }
}
于 2016-11-24T23:10:32.523 回答
1

试试这个矢量化:

m <- as.matrix(mydf)
n <- 3 # number of randoms to be selected
inds <- cbind(rep(1:nrow(mydf), each=n), c(replicate(nrow(mydf), sample(ncol(mydf), n))))
m[inds] <- NA
res <- as.data.frame(m)

方法如下:

  1. 首先取数据框的矩阵以受益于所需的向量化
  2. 定义每行随机选择的列数
  3. 生成矩阵inds,其中放置数据框的每一行和相应的随机列
  4. 将这些行和列设置为NA
  5. 取回数据框

在中,您将有一个数据框,其中每行res随机设置 3 列。NA提供的数据帧的输出是:

           # QA          QB          QC        QD         QE         QF
# 1  -0.6264538          NA          NA  1.358680 -0.1645236         NA
# 2   0.1836433          NA  0.78213630        NA -0.2533617         NA
# 3          NA          NA  0.07456498        NA  0.6969634  0.3411197
# 4          NA -2.21469989          NA        NA  0.5566632 -1.1293631
# 5          NA  1.12493092  0.61982575        NA         NA  1.4330237
# 6  -0.8204684 -0.04493361          NA        NA         NA  1.9803999
# 7   0.4874291 -0.01619026          NA -0.394290         NA         NA
# 8   0.7383247          NA -1.47075238        NA         NA -1.0441346
# 9          NA  0.82122120          NA  1.100025         NA  0.5697196
# 10         NA  0.59390132  0.41794156        NA         NA -0.1350546

数据

set.seed(1)
mydf <- data.frame(QA = rnorm(10),
QB = rnorm(10), 
QC = rnorm(10), 
QD = rnorm(10), 
QE = rnorm(10), 
QF = rnorm(10))
于 2016-11-24T23:21:10.740 回答