根据第二个行号列表将一个列表中的特定行分配为NA

时间:2018-06-15 07:09:08

标签: r

这是一些模拟我的问题的代码。模拟数据具有相同的维度(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    |

1 个答案:

答案 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]]})