2014-06-17 43 views
0

我的代碼中被設定爲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的每個元素進行迭代,並用1 IF更換排所有NAS該行不會超過NAs的數量。我用打印語句測試了我的代碼,發現迭代完美工作(儘管不是最有效的代碼),如果我通過在函數的最後一個括號之前放入修復(myData)來檢查修改的myData,我會看到我的函數完美工作(對於符合限制條件的行,NAs將替換爲1)。但是,當我在函數終止後檢查myData時,myData不會顯示replaceNA所做的更改。

我知道存儲修改後的myData存在問題,但我不確定如何正確存儲它。

+4

函數就像是拉斯維加斯。函數中的函數_stays_會發生什麼(除非您明確地返回它)。 – joran

+0

另外,這裏是什麼?它是一個用戶定義的函數嗎? – agstudy

+0

rowsum()存在於R中:http://stat.ethz.ch/R-manual/R-patched/library/base/html/rowsum.html –

回答

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 
+0

條件是,如果小於或等於某一行中的限制(假設爲2),則將該行中的所有NA替換爲1.如果該行中存在多於2個的NAs行,你不會取代NAs。 –

+0

@ user3749778你可以看到我的編輯。 – agstudy

+0

否則,你的代碼比我的更簡潔。我最終放棄了這個功能,只是放入了兩行代碼。謝謝你的幫助! –

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的答案似乎很好地涵蓋了這種方法。

+0

我明白函數內的對象只存在於函數體內,但是,這個函數正在修改一個全局變量。這不是在java中的void函數的等價物嗎?所以即使在函數終止後修改仍然存在,或者我相信。 –

+0

不!在函數式編程(https://en.wikipedia.org/wiki/Functional_programming)範式中(R是功能性的,Java不是),函數沒有「副作用」,這意味着它們不會修改全球環境。該功能修改您傳遞數據的副本,原始數據不變。 – Gregor

+0

ahhhh,我明白了,所以所有的函數都應該返回一些東西或者將某些東西存儲到全局變量中,否則當函數終止時它會丟失。謝謝你的解釋。正如你可能假設的那樣,我幾天前剛剛拿起R,每一個解釋都有幫助! –