2015-07-28 2 views
2

Это продолжение this question. Я хочу нарисовать случайную выборку из каждой строки data.frame независимо от других строк. data.frame может содержать NA, как указано в данном data.framedf.Случайные образцы из каждого столбца data.frame, содержащие NA

set.seed(12345) 
df1 <- c(rnorm(n=4, mean=0, sd=1), NA) 
df2 <- rnorm(n=5, mean=10, sd=1) 
df <- rbind(df1, df2) 

t(apply(df, 1, sample, replace=TRUE)) 

     [,1]  [,2]  [,3]  [,4] [,5] 
df1 0.5855288  NA -0.1093033 0.709466  NA 
df2 9.7238159 9.723816 8.1820440 9.723816 10.6301 

Из первой строки, я хочу, чтобы выбрать четыре наблюдения (не пустые столбцы) с заменой и из второго ряда, я хочу, чтобы выбрать пять наблюдений (не пустые столбцы) с заменой независимо от первого выбора. Но мой данный код выбирает пять наблюдений с заменой из первой строки и пяти наблюдений с заменой второго ряда. Любая помощь в этом отношении будет высоко оценена. Спасибо

+0

Да, вы абсолютно правы @akrun. – MYaseen208

+0

Возможно, 'lst <- apply (df, 1, function (x) sample (x [! Is.na (x)], replace = TRUE)); do.call (rbind, lapply (lst,' length <-' , max (lengths (lst)))) ' – akrun

+0

Спасибо @akrun за ваш полезный комментарий. Не могли бы вы изменить свой комментарий, чтобы ответить. – MYaseen208

ответ

1

Я думаю, вы хотите sample только с значениями, отличными от NA. В этом случае !is.na может быть полезен для удаления значений NA, а затем мы оставим sample на оставшиеся значения. Выход будет list ('lst'), поскольку количество элементов будет отличаться (4 и 5) для каждой строки после sample.

lst <- apply(df, 1, function(x) sample(x[!is.na(x)], replace=TRUE)) 

Если нам нужно преобразовать эти list в matrix, мы можем добавить «NA» в конце, чтобы длина одинакова для каждого из list элементов, и мы используем rbind, чтобы преобразовать его обратно в matrix.

do.call(rbind,lapply(lst, `length<-`, max(lengths(lst)))) 
+1

Спасибо @akrun. Это то, что мне нужно. Еще раз спасибо. – MYaseen208

Смежные вопросы