在函数内修改数据集但数据集未更改
Posted
技术标签:
【中文标题】在函数内修改数据集但数据集未更改【英文标题】:Modifying Data Set within a function but data set is not changed 【发布时间】:2014-06-17 18:49:43 【问题描述】:我的代码在 R 中如下:
replaceNA<- function(myData,limit)
numNA<- rowsum(is.na(myData))
targetRows<- which(numNA<=limit)
targetCols<- length(names(myData))
for(row in targetRows)
for(col in 1:targetCols)
myData[row,col][is.na(myData[row,col])]<-1
我正在尝试遍历 myData 中的每个元素,并将行的所有 NA 替换为 1,如果该行的 NA 数量不超过该行。我用 print 语句测试了我的代码,发现迭代工作完美(尽管不是最有效的代码),如果我通过在函数的最后一个括号之前放入 fix(myData) 来检查修改后的 myData,我看到我的函数完美运行(对于满足限制条件的行,NA 被替换为 1)。但是,当我在函数终止后检查 myData 时,myData 不会显示 replaceNA 所做的更改。
我知道存储修改后的 myData 存在问题,但我不确定如何正确存储它。
【问题讨论】:
功能就像拉斯维加斯。函数中发生的事情停留在函数中(除非你明确地返回它)。 另外,这里的rowsum是什么?是用户自定义函数吗? rowsum() 存在于 R 中:stat.ethz.ch/R-manual/R-patched/library/base/html/rowsum.html 对不起,您是对的,在这种情况下必须使用 rowSums()。谢谢! 【参考方案1】:条件不清楚(英文问题)。在任何情况下,您都不需要这里的 for 循环。
计算每行缺失值的数量:
rowSums(is.na(myData))
然后您只需测试您的条件并替换所有行:
mm <- myData[rowSums(is.na(myData)) <= limit ,]
mm[is.na(mm)] <- 1
myData[rowSums(is.na(myData)) <= limit ,] <- mm
【讨论】:
条件是,如果一行中的 NA 数量小于或等于限制(在这种情况下假设为 2),则将该行中的所有 NA 替换为 1。如果有该行中的 NA 超过 2 个,则不要替换 NA。 否则,你的代码比我的更简洁。我最终废弃了这个函数,只放了两行代码。谢谢你的帮助! @user3749778 简洁是的,但更重要的是它是矢量化代码,所以更快。【参考方案2】:你应该让你的函数显式返回修改后的数据,
replaceNA<- function(myData,limit)
numNA<- rowsum(is.na(myData))
targetRows<- which(numNA<=limit)
targetCols<- length(names(myData))
for(row in targetRows)
for(col in 1:targetCols)
myData[row,col][is.na(myData[row,col])]<-1
return(myData)
然后分配修改后的数据。您可以覆盖旧数据
myData <- replaceNA(myData, limit = 2)
或复制一份来比较
myData_no_na <- replaceNA(myData, limit = 2)
您也可以完全避免循环,这更像 R。 @agstudy 的回答似乎很好地涵盖了这种方法。
【讨论】:
我知道函数中的对象只存在于函数体内,但是,这个函数正在修改一个全局变量。这不相当于java中的void函数吗?因此,即使在函数终止后,修改仍然应该存在,或者我相信。 不!在functional programming 范式中(R 是函数式的,Java 不是),函数没有“副作用”,这意味着它们不会修改全局环境。该函数会修改您传递给它的数据的副本,原始数据保持不变。 ahhhh,我明白了,所以所有函数都应该返回一些东西或将一些东西存储到一个全局变量中,否则它会在函数终止时丢失。谢谢你的解释。正如您可能认为的那样,我几天前刚接触到 R,每一个解释都有很大帮助! 差不多。其他函数不返回任何内容,但具有所需的副作用(例如,plot()
、print()
或 write.csv()
)。有些函数确实会修改全局变量(options()
),但几乎所有用户定义的函数都不应该触及全局环境。如果您想了解有关 R 编程这方面的更多信息,您可能需要查看 Advanced R 的函数式编程部分。以上是关于在函数内修改数据集但数据集未更改的主要内容,如果未能解决你的问题,请参考以下文章