我有13行和28列的全字符矩阵(my_matrix):
N N ... S N
N S ... F N
N S ... Z NA
NA S ... F NA
.. .. ... .. ..
NA NA ... N NA
我想做的是
将它们存储为单独的向量,看起来像这样(或者按行,无论哪种方式都可以):
my_vector1 = N N N
my_vector2 = N S S S ...etc.
我所做的就是编写一个如下所示的循环:
forbidden_letter <- c("Z", "B", "E", "V", "D", "VS", "VZ")
for(i in 1:28) {
if(!any(forbidden_letter %in% my_matrix[,i]==TRUE)){
temp_my_vector <- matrix(my_matrix[,i], byrow = TRUE)
my_vector <- matrix(temp_my_vector[!temp_my_vector %in% NA], byrow= TRUE)
print(my_vector)}
}
my_vector
使用这段代码,我只得到my_vector的最后一次迭代
如何将每个迭代保存到单独的向量中?
答案 0 :(得分:0)
让我们考虑一些数据:
(dat <- cbind(c("N", "N", "N", NA, NA), c("N", "S", "S", "S", NA), c("S", "F", "Z", "F", "N"), c("N", "N", NA, NA, NA)))
# [,1] [,2] [,3] [,4]
# [1,] "N" "N" "S" "N"
# [2,] "N" "S" "F" "N"
# [3,] "N" "S" "Z" NA
# [4,] NA "S" "F" NA
# [5,] NA NA "N" NA
forbidden_letter <- c("Z", "B", "E", "V", "D", "VS", "VZ")
您可以使用apply
单独处理每列:
(vectors <- apply(dat, 2, function(x) if (any(x %in% forbidden_letter)) NULL else x[!is.na(x)]))
# [[1]]
# [1] "N" "N" "N"
#
# [[2]]
# [1] "N" "S" "S" "S"
#
# [[3]]
# NULL
#
# [[4]]
# [1] "N" "N"
然后,您可以使用以下内容获取每列的向量:
vectors[[1]]
# [1] "N" "N" "N"
vectors[[4]]
# [1] "N" "N"
答案 1 :(得分:0)
我相信您希望根据某些条件过滤矩阵。
如果您有矩阵my_matrix
,则可以先使用禁用字母过滤列:
for(col in names(my_matrix)) {
if (any(my_matrix[, col] %in% forbidden_letter)) {
my_matrix[, col] <- NULL
}
}
这将删除带有禁止字母的列。
现在,您可以通过
访问任何列my_matrix[, col_name]
或
my_matrix[, col_index]
结果已经是一个矢量,如你所愿。您不需要按照预期将每个列存储在另一个变量中。 matrix
对象已经为您做到了。
最后,要删除NA
值,您只需在过滤后执行na.omit
即可。例如,
print(na.omit(my_matrix[, 3]))
将仅打印出第三列的非NA值。逻辑可以扩展到任何列。