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

Posted

技术标签:

【中文标题】如何从R中的数据框中删除负值【英文标题】:how to remove the negative values from a data frame in R 【发布时间】:2017-08-06 21:19:24 【问题描述】:

我想从数据框中删除负值,然后我需要分别计算每一行的平均值(每行正值的平均值) 我写这个是为了删除负值,但它没有用。我有这样的警告:

[<-.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

【问题讨论】:

data.frames 中不能有 NULL 值。您可以将它们设置为“缺失”的NA。然后您可以使用rowSums(..., na.rm=T) 忽略NA 值。 谢谢@MrFlick 【参考方案1】:

我要补充一点,不需要写for循环,设置即可:

dframe[dframe < 0] <- NA

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

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

rowMeans(dframe, na.rm=TRUE) 

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

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

要仅考虑非 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)] &lt;- ?? 将 NaN 值替换为所需的值

【讨论】:

我认为你们俩的意思是rowMeans,而不是rowSums 哈!是的,感谢您了解这一点,编辑答案 非常感谢。我已经写过: dframe[dframe mea NA 是“不可用”并且是缺失值指示符,而 NaN 是“不是数字”,当算术运算的结果无法以数字方式定义时产生,例如0/0。我看不到您的 dframe 值,但我猜这是在设置 na.rm=TRUE 时在所有值均为 NA 时采用行均值的结果。查看 mean(c(NA, NA, NA), na.rm=TRUE) 与 mean(c(NA, NA, NA), na.rm=FALSE) 之间的差异。当所有行值为负时,您可以保留 NaN 或决定如何定义行均值。 我编辑了关于如何处理由 rowMeans 产生的 NaN 的答案。【参考方案2】:

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

df <- df[df > 0]

这样,任何具有负值的行都将不再存在于您的数据框中。

【讨论】:

【参考方案3】:

这是另一种可能对某人有所帮助的方式。

我之前也遇到过同样的问题,但是我决定使用 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)

这样可以更轻松地分发给其他人,并在需要时检查错误或否定原因。

适用于财务案例或已为其他员工操纵的数据

【讨论】:

以上是关于如何从R中的数据框中删除负值的主要内容,如果未能解决你的问题,请参考以下文章

如何从R中的数据框中删除重复的行[重复]

从SPSS导入时如何从R中的数据框中删除空格

R:如何从该列表中的所有数据框中删除行?

从R中的多个数据框中删除同一列

如何从R数据框中的列名中删除不必要的单引号(')?

如何将当前行的负值转移到数据框中的前一行?