将每次迭代的循环结果存储为单独的向量

时间:2018-04-18 17:09:47

标签: r loops vector

我有13行和28列的全字符矩阵(my_matrix):

    N   N  ...  S  N
    N   S  ...  F  N
    N   S  ...  Z  NA
    NA  S  ...  F  NA
    .. ..  ...  .. ..
    NA NA  ...  N  NA

我想做的是

  1. 删除所有NA(s)
  2. 删除至少包含以下其中一个字符的所有列:“Z”, “B”,“E”,“V”,“D”,“VS”,“VZ”
  3. 将它们存储为单独的向量,看起来像这样(或者按行,无论哪种方式都可以):

    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的最后一次迭代

    如何将每个迭代保存到单独的向量中?

2 个答案:

答案 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值。逻辑可以扩展到任何列。