这是一些模拟我的问题的代码。模拟数据具有相同的维度(74个主题,时间序列中178个时间点,294个变量+8个令人讨厌的变量)
fulldata = lapply(1:74, function(i) matrix(rnorm(300,0,1), ncol=300,nrow=178))
rownumbers = seq(1:178)
badrows = lapply(1:74, function(i) sample(rownumbers, size=10, rownumbers,replace=FALSE))
现在我需要做的是用NAs替换列表“fulldata”中相应矩阵中列表中每个向量中列出的行
这些时间点已损坏并将进行插值。但首先必须用NAs替换坏的值。
这不起作用。
lapply(1:74, function(l) lapply(1:74, function(l) fulldata[[l]][badrows[[l]],1:294]<-NA))
returns list that looks like this:
[[74]][[72]]
[1] NA
[[74]][[73]]
[1] NA
[[74]][[74]]
[1] NA
这也不起作用。
lapply(1:74, function(l) fulldata[[l]][badrows[[l]],1:294]<-NA)
Returns list that looks like this:
[[72]]
[1] NA
[[73]]
[1] NA
[[74]]
[1] NA
这只返回NAs的矢量
sapply(1:74, function(i) fulldata[[i]][badrows[[i]],1:294] <- NA)
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[34] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[67] NA NA NA NA NA NA NA NA
我也尝试了一些mapply的东西,但是当R冻结起来并且不记得我做了什么的时候丢失了线条。我期待的是输出是这样的,其中“坏行”被NA替换为1-294和295-300列未更改:
(不能让表格出现在这里,但无论如何都要离开)
| var1 | var2 | var3 | ........ | var295 | ..... | var300 |
|------|------|------|----------|--------|-------|--------|
| 3 | 1 | 5 | ....... | .72 | ..... | .23 |
| NA | NA | NA | ........ | .10 | ..... | .98 |
| 5 | 7 | 12 | ........ | .42 | ..... | 1.2 |
答案 0 :(得分:1)
以这种方式:
lapply(1:74, function(iii) "[<-"(fulldata[[iii]], badrows[[iii]],, NA))
相当于
mapply(function(x,y) "[<-"(x, y,, NA), fulldata, badrows, SIMPLIFY = FALSE) # without setting SIMPLIFY to FALSE you get one large matrix
和
mapply("[<-", fulldata, i=badrows, MoreArgs=alist(j=, value=NA), SIMPLIFY=FALSE)
# j= # this corresponds to the empty second argument in [i,j]
上面的代码受到以下事实的影响:子集赋值返回分配的值,而不是整个对象。
sapply(1:74, function(i) fulldata[[i]][badrows[[i]],1:294] <- NA)
# does the same thing as ...
sapply(1:74, function(i) NA)
为了改善这一点,您可以使函数返回整个对象:
sapply(1:74, function(i) {fulldata[[i]][badrows[[i]],1:294] <- NA; fulldata[[i]]})