2017-04-06 46 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一个包含字符和数字列的数据框,并且我想要随机数组,不管列类型如何。 –

相关问题