繁体   English   中英

在功能内修改数据集,但数据集未更改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM