我的代码如下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中的每个元素,并将行的所有NAs替换为1 IF,如果该行的数量不超过NA的数量。我用print语句测试了我的代码,发现迭代工作得很好(虽然不是最有效的代码),如果我通过在函数的最后一个括号之前放入一个修复(myData)来检查修改后的myData,我看到我的功能完美地工作(对于满足极限条件的行,NA被替换为1)。但是,当我在函数终止后检查myData时,myData不会显示replaceNA所做的更改。
我知道存储修改后的myData存在问题,但我不确定如何正确存储它。
答案 0 :(得分: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
答案 1 :(得分:0)
您应该使您的函数显式返回修改后的数据
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的回答似乎很好地涵盖了这种方法。