我有一个像这样的矩阵:
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)出错: 如果'na.rm'为FALSE
,则不允许缺少值和NaN
当我尝试这段代码时:
for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv[[i]], 0.5))
}
我得到了
(1 - h)中的错误* qs [i]:二元运算符的非数字参数
任何帮助都将不胜感激。
答案 0 :(得分: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"
答案 1 :(得分:1)
sample_frac()
中的dplyr
功能听起来符合您的需求。
install.packages('dplyr')
library(dplyr)
subset_matrix <- apply(mv, 2, function(x) sample_frac(x, .5, replace = F))
您可以在sample_frac()
中指定要采样的行数。逐列apply()
将为每列提供一小部分观察结果。
我没有对此进行测试,因为您没有提供数据样本,但它看起来应该有效。