如何从R中的数据帧中删除负值

coc*_*mat 0 for-loop if-statement r dataframe

我想从数据帧中删除负值,然后我需要分别计算每行的平均值(每行正值的平均值)。我有这样的警告:

在错误[<-.data.frame*tmp*,I,J,=值NULL):替换具有零长度

我该如何解决这个问题?

for (i in 1:1000) {
  for(j in 1:20){
     if (dframe[i,j]<=0) dframe[i,j]<-NULL
     j=j+1
  }
  i=i+1
}
Run Code Online (Sandbox Code Playgroud)

Djo*_*ork 5

我想补充一点,没有必要编写for循环,您可以设置:

dframe[dframe < 0] <- NA
Run Code Online (Sandbox Code Playgroud)

dframe < 0dframe小于零时,As 给出逻辑索引TRUE,可用于索引dframe并将TRUE值替换为NA。

@MrFlick解释了使用NA而不是NULL的方法,以及在计算每行均值时如何忽略NA值:

rowMeans(dframe, na.rm=TRUE) 
Run Code Online (Sandbox Code Playgroud)

编辑以回答问题re:产生NaN的rowMeans以及如何删除:

NA是“不可用”,并且是缺失值指示符,而NaN是“非数字”,当无法通过数字定义算术运算的结果(例如0/0)时可以生成。我看不到您的dframe值,但我想这是在设置na.rm = TRUE时所有行值均为NA时采用row手段的结果。参见均值(c(NA,NA,NA),na.rm = TRUE)与均值(c(NA,NA,NA),na.rm = FALSE)之间的差异。您可以保留NaN或决定在所有行值均为负且已被NA取代时如何定义行均值。

要仅考虑非NaN值,可以使用而不是NaN子集!is.nan,请参见以下示例:

mea <- c(2, 4, NaN, 6)
mea
# [1]   2   4 NaN   6
!is.nan(mea) # not NaN, output logical
# [1]  TRUE  TRUE FALSE  TRUE 
mea <- mea[!is.nan(mea)]
# [1] 2 4 6
Run Code Online (Sandbox Code Playgroud)

或者您可以通过设置将NaN值替换为所需的值 mea[is.nan(mea)] <- ??