[英]Modifying Data Set within a function but data set is not changed
我的代码在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时存在问题,但是我不确定如何正确存储它。
条件不明确(英语问题)。 无论如何,这里都不需要for循环。
要计算每行缺失值的数量:
rowSums(is.na(myData))
然后,您只需测试条件并替换所有行:
mm <- myData[rowSums(is.na(myData)) <= limit ,]
mm[is.na(mm)] <- 1
myData[rowSums(is.na(myData)) <= limit ,] <- mm
您应该使函数显式返回修改后的数据,
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的答案似乎很好地涵盖了该方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.