编辑:替代解决方案(一行)
或者(根据您的 cmets),您可以在一行中用 NA 替换正值:
mydata = apply(mydata,2,function(x){x = ifelse(x <= 0,x,NA)})
这是mydata之前第一行的输出:
> as.numeric(mydata[1,])
[1] NA -0.34975424 -0.07767320 -1.16193756 -0.33768064 -1.09321744 0.66392711 0.27303842 -2.23650827
[10] -0.42412913 1.44870575 0.03134468 0.19868021 0.17935206 1.51321052 -0.33100059 0.26331289 -0.20527804
[19] -0.22355074 -0.96041834 -0.82061841 0.67362771 -1.11751900 -0.58768884 -1.14399798 0.11782292 -1.51231253
[28] -1.93607886 -0.33478355 0.70214667 0.51443110 -1.04816477 -1.20696026 -0.97035477 -0.40159316 0.80351157
[37] 1.07208956 0.08778464 0.40148417 1.27912058 -0.90539292 -2.57307640 -0.38050016 -0.51386913 0.39852024
[46] 0.68074424 -0.04131547 -1.58519483
之后:
> as.numeric(mydata[1,])
[1] NA -0.34975424 -0.07767320 -1.16193756 -0.33768064 -1.09321744 NA NA -2.23650827
[10] -0.42412913 NA NA NA NA NA -0.33100059 NA -0.20527804
[19] -0.22355074 -0.96041834 -0.82061841 NA -1.11751900 -0.58768884 -1.14399798 NA -1.51231253
[28] -1.93607886 -0.33478355 NA NA -1.04816477 -1.20696026 -0.97035477 -0.40159316 NA
[37] NA NA NA NA -0.90539292 -2.57307640 -0.38050016 -0.51386913 NA
[46] NA -0.04131547 -1.58519483
以前的解决方案
这是另一种解决方案,可能不是最好的,但看起来应该没问题。
使用您描述的数据框:
set.seed(123)
mydata <- data.frame(matrix(rnorm(406*48), nrow = 406, ncol = 48))
diag(mydata) <- NA
mydata[10:20,25:40] <- NA
我们基本上会创建一个列表来存储每一行的所有负值
list_data = vector("list",nrow(mydata))
for(i in 1:nrow(mydata))
{
list_data[[i]] = mydata[i,which(mydata[i,]<=0)]
}
然后,为了将列表转换为数据框,我们用 NA 值填充每个缺失值,以便每行具有完全相同数量的值
maxlength = max(sapply(list_data,length))
List_Data = lapply(list_data, function(x){c(x,rep(NA,maxlength-length(x)))})
List_Data = do.call(rbind,List_Data)
List_Data = data.frame(List_Data)
这里是第一列的输出:
> head(List_Data)
X1 X2 X3 X4 X5 X6 X7 X8 X9
1 NA -0.3497542 -0.07767320 -1.16193756 -0.3376806 -1.0932174 -2.2365083 -0.42412913 -0.3310006
2 -0.2301775 NA -1.58908969 -0.03795763 -0.4079667 -0.2509906 -0.5778989 -0.14031375 -1.5660913
3 -0.5388092 NA -1.16618981 -0.22729115 -0.5017032 -1.0556810 -1.0237632 -0.89231744 -2.0031559
4 NA -1.0387278 -0.07765504 -0.15323396 -0.8953830 -1.3724905 -0.5035273 -0.05266103 -1.0722186
5 -0.1941524 -2.1645471 NA -0.90793470 -0.7849893 -0.8245955 -0.3935175 -0.18426891 -0.0757480
6 -0.6375688 NA -0.13461283 -1.03171727 -1.1625653 -0.7045958 -0.5746850 -0.19752782 -0.3510071
正如我所说,可能有最快、更优雅的方法来实现相同的结果,但这种解决方案有效。