2015-06-08 26 views
1

我有一個R中的代碼,通過data.frame在當時讀取一行,如果符合某些條件,則更改data.frame中的一個變量的值。在僞碼:如何確定給出錯誤的數據點?

for(i in 1:nrow(data)) { 

if (conditions on data[i,]) { change value } else {do nothing} 

} 

當代碼運行時,在某一點停止和引發以下錯誤消息:Error in if (condition : missing value where TRUE/FALSE needed

據我所知,該錯誤消息表示,在某一點,當對if聲明中的條件進行評估,結果爲Na而不是TRUEFALSE

然而,當我通過使用「存儲」在R(和我假設是拋出錯誤的數據集的行)的i值嘗試R中的條件I得到的TRUE答案。我是否正確理解i的值允許我確定哪一行數據幀正在拋出錯誤?如果不是,我應該尋找其他方法來確定哪一行數據集導致錯誤?

+0

如果'data'是一個data.frame,你通常會使用'for(i in 1:nrow(data))'。看看'暗淡(數據)'來看看你得到了什麼。此外,沒有** [可重現的例子](http://stackoverflow.com/a/28481250/2725969)**很難提供幫助。另外,'ifelse'可能是一種更好的方式來做你想做的事情。 – BrodieG

+0

@BrodieG感謝您的反饋。我想我的問題是更具體地詢問我是否可以使用'i'來確定data.frame的哪一行會拋出錯誤,而不是錯誤本身的性質。是這樣嗎?存儲在R中的'i'的值是否表示代碼遇到錯誤的行? –

+0

是的,但請記住'data [i]'返回第i列,而不是第i行。對於你需要'data [i,]'的行。另外,請注意我上面關於'nrow'和'dim'的評論。 – BrodieG

回答

0

只要因爲for循環不在函數內部,所以我將等於它在錯誤發生之前碰到的最終值。因此,在您的錯誤後:

data[i, ] 

應該給你的病理行。

如果你正在一個函數內運行,由於作用域規則,我應該死於這個函數。在這種情況下,我會修改代碼以打印出每一行(或i)直到它死亡:

for(i in 1:nrow(data)) { 
    print(i) #or print(data[i, ]) 
    if (conditions on data[i,]) { change value } else {do nothing} 

} 
1

我認爲答案是 「是」

print(i) ## Error: doesn't exist yet 
for (i in 1:10) { 
    if (i==4) stop("simulated error") 
} 
print(i) ## 4 

try()功能也非常有用。在這裏,我們製作一個模擬錯誤的函數f,然後使用try(),這樣我們就可以在循環中一直運行。當我們遇到錯誤時,我們不會停下來,而是填寫一個表示錯誤代碼的值(在這種情況下爲10000)。 (我們也可以只讓錯誤的行爲是一個空操作,即只要進入到循環的下一次迭代。在這種情況下,將在錯誤位置留下NA

f <- function(x) { 
    if (x==4) stop("simulated error") 
    return(x) 
} 
results <- rep(NA,10) 
for (i in 1:10) { 
    res <- try(f(i)) 
    if (is(res,"try-error")) { 
     results[i] <- 10000 
    } else { 
     results[i] <- res 
    } 
} 
+0

我認爲你在for循環中「丟失」了一個''''''。另外,我試圖弄清楚for循環實際上在做什麼:你能澄清一下嗎?當我運行它時,我收到以下錯誤消息:'f(i)中的錯誤:模擬錯誤'是否是所需的輸出?如果是這樣,這是什麼意思? –

0

1)替換值

豈不是更好地使用replace

一些例子在這裏:replace function examples

你的情況

replace (df$column, your_condition, value) 

2)過濾

如果你確定你的數據只包含TRUEs/FALSEs或NAS,您可以:

a)具有特定列中的NA的子集行

df[(is.na(df$column)), ] 

b)由dplyr

library("dplyr") 
filter(df, is.na(column)) # filter NAs in dplyr you don't have to use $ to specify column 
filter(df, !is.na(column) & column!="FALSE") # filter everything other than NA and FALSE 
filter(df, column!="TRUE" & column!="FALSE") # careful with that, won't return NAs 

3)選擇行號過濾掉使用filter東西

最後,當你需要的地方來港發生的特定行號,使用which

which(is.na(df$column)) # row numbers with NAs 
which(df$column!="TRUE") # row numbers other than TRUEs 
which(df$column!="TRUE" & df$column!="FALSE") # again, won't return NAs 
+0

我會看看'replace()':謝謝你的建議。要解決您的其他一些意見:我的數據框不包含「TRUE」或「FALSE」或「NA」值。 'TRUE'或'FALSE'是我的代碼中'if'語句的結果。 –