2015-06-08 28 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'语句的结果。 –