2016-03-05 41 views
1
x1=c(55,60,75,80) 
x2=c(30,20,15,23) 
x3=c(4,3,2,6) 
x=data.frame(x1,x2,x3) 

從這個功能:如何改變循環的最終結果爲數據幀

NAins=function(x,alpha=0.3){ 
    x.n=NULL 
    for (i in 1:ncol(x)){ 
    S= sort(x[,i], decreasing=TRUE) 
    N= S[ceiling(alpha*nrow(x))] 
    x.n= ifelse(x[,i]>N, NA, x[,i]) 
print(x.n) } 
} 

如何最終結果保存爲adataframe樣子原始數據集,但是我用data.frame(x.nmar)。 以及如何從循環中獲得結果?

+1

如果你想這樣的循環方式,則需要預先定義一個矩陣或數據幀,然後填滿它。循環結束後,您將需要「返回」它,因爲您在該函數中創建的所有變量都將被刪除。 'print'並沒有被保存在任何地方。另外,在循環中運行'ceiling(alpha * nrow(x))'沒有任何意義,因爲它始終保持不變。如果每次只有一個選項,則不需要'ifelse'。 –

+0

@DavidArenburg,在循環之前,我創建了具有相同長度原始數據的空數據框,但它沒有任何意義。 – user5934339

+0

因爲你還沒有預先定義任何東西。你只是每次給它賦值NULL。我會發佈一個答案,告訴你應該怎麼做 –

回答

1

轉換評論回答

如果你想實現這種循環方式,你需要預定義一個矩陣o r數據框,然後填寫它(在您的情況下,您可以使用原始的xdata.frame,因爲該功能不會更新全局環境中的原始數據集)。循環結束後,您將需要返回它,因爲您在該函數中創建的所有變量都將被刪除。 print也沒有被保存在任何地方。而且,在循環中運行ceiling(alpha*nrow(x))沒有意義,因爲它始終保持不變。如果您每次只有一個選擇,則不需要ifelse。見下面

NAins=function(x, alpha = 0.3){ 
    N <- ceiling(alpha * nrow(x)) ## Run this only once (take out of the loop) 
    for(i in 1:ncol(x)){ 
    S <- sort(x[, i], decreasing = TRUE) 
    x[x[, i] > S[N], i] <- NA # don't use `ifelse`, you only inserting one value 
    } 
    x # return the result after the loop ends 
} 

測試

NAins(x) 
# x1 x2 x3 
# 1 55 NA 4 
# 2 60 20 3 
# 3 75 15 2 
# 4 NA 23 NA 
+0

大衛阿倫伯格,非常感謝你的建議,但只是改變'x.n#將結果後綴'返回到'x'給你的結果。 – user5934339

+0

是的,我已經編輯過了。這是一個錯字。謝謝。 –

2

最好使用lapply位置避免for-loop的副作用:

NAins <- function(x,alpha=0.3){ 
    Nr <- nrow(x) 
    lapply(x,function(col){ 
    S <- sort(col, decreasing=TRUE) 
    N <- S[ceiling(alpha*Nr)] 
    ifelse(col>N, NA, col) 
    }) 

然後你就可以將結果強制到data.frame

as.data.frame(NAins(dx))