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

时间:2017-03-15 22:05:31

标签: r if-statement for-loop dataframe

我想从数据框中删除负值然后我需要分别计算每行的平均值(每行的正值的平均值) 我写这篇文章是为了消除负面价值,但它并没有奏效。我有这样的警告:

  

[<-.data.frame中的错误(*tmp*,i,j,value = 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
}

3 个答案:

答案 0 :(得分:4)

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

dframe[dframe < 0] <- NA

由于dframe < 0给出逻辑索引TRUE,其中dframe小于零,并且可用于索引dframe并用NA替换TRUE值。

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

rowMeans(dframe, na.rm=TRUE) 

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

NA是“不可用”并且是缺失值指示符,而NaN是“不是数字”,当算术运算的结果不能用数字定义时,例如,可以产生NaN。 0/0。我看不到你的dframe值,但我猜这是当所有行值都是NA时取行的意思,同时设置na.rm = TRUE。参见平均值(c(NA,NA,NA),na.rm = TRUE)与平均值(c(NA,NA,NA),na.rm = FALSE)之间的差异。当所有行值为负且已被NA替换时,您可以离开NaN或决定如何定义行方式。

要仅考虑非NaN值,您可以使用!is.nan对非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

或者您可以通过设置mea[is.nan(mea)] <- ??

将NaN值替换为某个所需的值

答案 1 :(得分:0)

使用数据框的负值删除所有行的更简单方法是:

df <- df[df > 0]

这样,任何具有负值的行都将停止在您的数据框中。

答案 2 :(得分:0)

这是另一种可以帮助某人的方法。

我以前也遇到过同样的问题,但是我决定使用dplyr解决这个问题。

    library("dplyr")

       data <- data %>%
            filter(column > 0)

 rowMeans(data, na.rm = TRUE)

我也建议在得到进一步澄清之后,有时需要同时获得(阴性和阳性)这就是为什么它们是阴性或其他情况的原因。

resultPos2 <- result2 %>%# we get the df that is positive
    filter(periodBudget > 0)

resultNeg2 <- result2 %>%# we get the df that is negative
    filter(periodBudget < 0)

这使得分发给其他人和检查错误(如果需要)或原因为负面的原因变得更加容易。

方便处理财务案例或为其他员工操纵的数据