我想从数据框中删除负值然后我需要分别计算每行的平均值(每行的正值的平均值) 我写这篇文章是为了消除负面价值,但它并没有奏效。我有这样的警告:
[<-.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
}
答案 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)] <- ??
答案 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)
方便处理财务案例或为其他员工操纵的数据