for循环在函数内不起作用

时间:2014-11-11 19:24:38

标签: r

作为R的新手,我对以下内容感到困惑。尝试使用另一个相关数据帧的值来在数据帧中植入NA的方法,我尝试使用此函数:

prueba = function(x)
{
     for (w in 1:nrow(x))
     {
         datanona[w, 1] = ifelse(is.na(x[w, 1]), stepsintervals[which(stepsintervals[ ,1] == x[w, 3]),
                                  2], x[w, 1])
     }
}

当我运行prueba(data),然后head(data)时,NAs仍在那里。现在,如果我只使用函数中的循环(使用数据而不是x),数据中的NA将消失,并被来自stepsintervals的预期值替换。

这种差异可能有一个简单的解释,但我还没能找到它。是否有善良的灵魂可以为这个问题提供一些启示?

3 个答案:

答案 0 :(得分:1)

当你调用prueba(.)时,它会执行for循环,但是在函数结束时,没有返回,因此它给人的印象是没有任何事情发生。

据推测,您希望在datanona中捕获结果,在这种情况下,您需要告诉函数返回对象

prueba = function(x)
{
     for (w in 1:nrow(x))
     {
         datanona[w, 1] = ifelse(is.na(x[w, 1]), stepsintervals[which(stepsintervals[ ,1] == x[w, 3]),
                                  2], x[w, 1])
     }

     ### ADD A RETURN LINE
     return(datanona)
}

答案 1 :(得分:0)

你说你在跑步:

prueba(data)
head(data)

但你应该跑步:

newData <- prueba(data)
head(newData)

您还应该返回(datanona)作为您函数的最后一行。您提供的代码似乎正在检查旧的未更改数据集的头部。

答案 2 :(得分:0)

您可能会发现更快的结果,也许通过执行类似伪代码的操作更容易理解。在R中,通常没有必要为子集和替换编写循环。

假设x是您的数据框。

# the id column is column 1 of stepsintervals and column 3 of df
datanona <- merge(x, stepsintervals, by="id", all.x=TRUE)

#assuming column 3 of stepsintervals was named imputed
#assuming column 1 of df is called value
datanona[is.na(datanona$value),"value"] <- datanona[is.na(datanona$value), "imputed"]

然后您可以删除datanona中不需要的列,如下所示:datanona$imputed <- NULL

希望这会有所帮助。