如何从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 < 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)] <- ??
将 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中的数据框中删除负值的主要内容,如果未能解决你的问题,请参考以下文章