如果超出一定范围,则将值更改为0

时间:2014-09-04 19:18:35

标签: r

我希望任何超出我想要范围的ET值为0(或NA),我认为应该这么简单:

df[df$ET < 0 & df$ET > 10,]<- 0

但是

 Error in [<-.data.frame(*tmp*`, daysum$ET < 0, , value = 0) : 
  missing values are not allowed in subscripted assignments of data frames

即使在没有&的情况下简化它,我也会得到同样的错误。

str(df):

'data.frame':   365 obs. of  3 variables:
 $ day     : Factor w/ 367 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Rain_Tot: num  0 0 0.254 0 0 0 0 0 0 0 ...
 $ ET      : num  0.776 0.529 0.432 0.458 0.435 ...

2 个答案:

答案 0 :(得分:0)

以下内容应该有效:

df$ET[df$ET < 0 | df$ET > 10] <- 0

演示:

## Sample data
set.seed(1)
df <- data.frame(ET = c(-5, 1, -6, 2, NA,
                        10, 11, NA, 3, 4),
                 V1 = 0)
df
#    ET V1
# 1  -5  0
# 2   1  0
# 3  -6  0
# 4   2  0
# 5  NA  0
# 6  10  0
# 7  11  0
# 8  NA  0
# 9   3  0
# 10  4  0

尝试以下方法,看看他们做了什么:

df$ET < 0
df$ET > 10
df$ET < 0 & df$ET > 10
df$ET < 0 | df$ET > 10

使用该信息,您可以使用:

df$ET[df$ET < 0 | df$ET > 10] <- 0

导致:

df
#    ET V1
# 1   0  0
# 2   1  0
# 3   0  0
# 4   2  0
# 5  NA  0
# 6  10  0
# 7   0  0
# 8  NA  0
# 9   3  0
# 10  4  0

答案 1 :(得分:0)

我认为它可能是您拥有的NAs,因为以下内容适用于我的一些测试数据:

df[df$ET < 0 & df$ET > 10]<- 0

(没有逗号)