作为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的预期值替换。
这种差异可能有一个简单的解释,但我还没能找到它。是否有善良的灵魂可以为这个问题提供一些启示?
答案 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
希望这会有所帮助。