这是一些模拟我的问题的代码。模拟数据具有相同的维度(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))
现在我需要做的是用NA替换列表“ fulldata”中相应矩阵的列表坏行中每个向量中列出的行
这些时间点已损坏,将被插值。但是首先必须将不良值替换为NA。
这行不通。
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
这只是返回NA的向量
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 |
这是一种方法:
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]]})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句