2014-09-04 19 views
0

我希望我的期望範圍之外的任何ET值是0(或NA),我想應該是這樣簡單:值更改爲0,如果外一定範圍

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 ... 
+0

同樣的錯誤信息,當我都嘗試。也許我的數據框有問題? – Nazer 2014-09-04 19:26:06

+0

有很多新手,我猜是什麼意思是「缺少值是不允許的」。任何方式來解決這個問題? – Nazer 2014-09-04 19:27:39

+0

請顯示'str(df)' – 2014-09-04 19:29:18

回答

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 
+0

當我嘗試你建議的「以下」時,我得到TRUE和FALSES,並且在最後一行中出現同樣的錯誤。 – Nazer 2014-09-04 19:41:40

+0

@Nazer,請正確粘貼***作爲最後一行。 – A5C1D2H2I1M1N2O1R2T1 2014-09-04 19:42:32

+0

我沒有忘記它的一部分!第一個df之後的'$ ET'。它解決了,我們有一個非常好的過濾示例!謝謝,阿難。 – Nazer 2014-09-04 19:44:02

0

我認爲它可能是你有來港,因爲下面的一些測試數據我有工作:

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

(沒有逗號)