Матрица поднабора, включая NA
У меня матрица вот так:
a b c d
[1] as ac ad ae
[2] bd bf bg bh
[3] NA cf cd ce
[4] NA NA dr dy
[5] NA NA NA ej
Я хотел бы разбить каждый столбец отдельно на матрицу или список, основанный на 50% наблюдений, поэтому я хотел бы, чтобы мой вывод выглядел так:
a b c d
[1] as ac ad ae
[2] NA bf bg bh
[3] NA NA NA ce
До сих пор я использовал для кодирования отдельных столбцов без NA.
mv.s <- subset(mv, mv <= quantile(mv, 0.5))
теперь я думал об использовании чего-то вроде
for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv, 0.5))
}
Однако, когда я делаю это, я получаю предупреждение:
Ошибка в quantile.default(mv, 0.5): пропущенные значения и NaN недопустимы, если "na.rm" равен FALSE
когда я пытаюсь этот код:
for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv[[i]], 0.5))
}
я получил
Ошибка в (1 - h) * qs[i]: нечисловой аргумент для бинарного оператора
Любая помощь будет оценена.
2 ответа
Без использования какого-либо пакета и только функции apply вы можете сделать следующее.
apply(mat, 2, FUN = function(x){ sample(x, ceiling(length(x)/2), replace = FALSE)})
Это берет случайную выборку ваших наблюдений за столбцом без замены и предполагает, что ваша матрица называется mat
,
Если вы используете set.seed(1)
чтобы сделать случайную выборку воспроизводимой, результат будет выглядеть следующим образом.
[,1] [,2] [,3] [,4]
[1,] "bd" NA NA "ae"
[2,] NA "ac" "cd" "ej"
[3,] NA "cf" "bg" "dy"
sample_frac()
функция в dplyr
Похоже, это соответствует вашим потребностям.
install.packages('dplyr')
library(dplyr)
subset_matrix <- apply(mv, 2, function(x) sample_frac(x, .5, replace = F))
Вы можете указать, какая часть строк вы хотите выбрать в sample_frac()
, С помощью apply()
по столбцам даст вам ту часть наблюдений для каждого столбца.
Я не проверял это, потому что вы не предоставили образец своих данных, но похоже, что он должен работать.