修改函数中的数据集但不更改数据集

时间:2014-06-17 18:49:44

标签: r for-loop dataset storage

我的代码如下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存在问题,但我不确定如何正确存储它。

2 个答案:

答案 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的回答似乎很好地涵盖了这种方法。