包含 NA 的子集矩阵
subsetting matrix including NA's
我有一个像这样的矩阵:
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))
}
但是,当我这样做时,我收到警告:
Error in quantile.default(mv, 0.5) :
missing values and NaN's not allowed if 'na.rm' is FALSE
当我尝试此代码时:
for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv[[i]], 0.5))
}
我明白了
Error in (1 - h) * qs[i] : non-numeric argument to binary operator
如有任何帮助,我们将不胜感激。
dplyr
中的 sample_frac()
功能听起来很符合您的需要。
install.packages('dplyr')
library(dplyr)
subset_matrix <- apply(mv, 2, function(x) sample_frac(x, .5, replace = F))
您可以指定要在 sample_frac()
中抽样的行部分。按列使用 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"
我有一个像这样的矩阵:
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))
}
但是,当我这样做时,我收到警告:
Error in quantile.default(mv, 0.5) : missing values and NaN's not allowed if 'na.rm' is FALSE
当我尝试此代码时:
for (i in 1:15) {
mv.s[[i]] <- subset(mv[[i]], mv <= quantile(mv[[i]], 0.5))
}
我明白了
Error in (1 - h) * qs[i] : non-numeric argument to binary operator
如有任何帮助,我们将不胜感激。
dplyr
中的 sample_frac()
功能听起来很符合您的需要。
install.packages('dplyr')
library(dplyr)
subset_matrix <- apply(mv, 2, function(x) sample_frac(x, .5, replace = F))
您可以指定要在 sample_frac()
中抽样的行部分。按列使用 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"