2017-04-06 44 views
0

我使用for循環(這很好地工作),用NA來隨機地替換數據集的每一行中的兩個值(該值的索引是隨機變化的在每一行)。
現在我想用apply()來做同樣的事情。
我想這個代碼(如到處都返回NA很多其他的事情):R Apply()函數,而不是需要索引值的循環

my_fun<-function(x){if (j %in% sample(1:ncol(y),2)) {x[j]<-NA}} 
apply(y,1,my_fun) 

但它不工作(它不會做任何改變初始數據集)。
問題是找不到對象j。 j應該是列的編號。 有人有想法嗎?

+0

你必須從你的函數返回'x'。在一個函數調用中,參數被賦值給函數per **按值調用** – jogo

+0

謝謝,但是這裏的問題是沒有找到對象j –

+0

y是什麼對象?請使用'dput()'來顯示您的數據!如果'y'是一個矩陣(或一個data.frame),那麼'apply(y,1,my_fun)'將逐行發送到你的函數'my_fun'。因此,在函數my_fun中,對象'x'是一個向量(即來自'y'的一行)。 – jogo

回答

0

從你的描述我認爲你想:

my_fun <- function(x) { x[sample(1:length(x), 2)] <- NA; x } 
apply(y, 1, my_fun) # or 
t(apply(y, 1, my_fun)) 

測試功能:

set.seed(42) 
y <- matrix(1:60, 10) 
y 
t(apply(y, 1, my_fun)) 
# > t(apply(y, 1, my_fun)) 
#  [,1] [,2] [,3] [,4] [,5] [,6] 
# [1,] 1 11 21 31 NA NA 
# [2,] 2 NA 22 32 NA 52 
# [3,] 3 13 NA NA 43 53 
# [4,] NA 14 24 34 NA 54 
# [5,] 5 15 25 NA 45 NA 
# [6,] 6 16 NA NA 46 56 
# [7,] 7 NA 27 37 47 NA 
# [8,] 8 18 NA 38 NA 58 
# [9,] NA 19 29 39 49 NA 
# [10,] 10 20 NA 40 50 NA 
+0

是的,非常感謝! –

+0

但現在我有一個新的問題,因爲我的一個變量是字符類型,在使用函數apply之後,我的所有數值都在字符類型中改變,我真的需要它們保持它們的原始類型... –

+0

y一個包含字符和數字列的數據框,並且我想要隨機數組,不管列類型如何。 –

相關問題