代码之家  ›  专栏  ›  技术社区  ›  John Wooten

如何获取两列矩阵中包含na或值<0的行的列表?

r
  •  0
  • John Wooten  · 技术社区  · 8 年前

    我有一个由10行组成的两列(用于测试)数组(cols)。例如。 科尔斯

           V243  V247
    1   693   761
    2  -733   791
    3   665  -756
    4    NA   892
    5   821    NA
    6   752   819
    7  1092 -1137
    8    NA   943
    9   675   720
    10  600   645
    

    如果任何列在该行上包含na,我希望得到一个带有t或f的一列10行向量,如果任何列在该行上包含值<0,我希望得到另一个带有t或f的一列10行向量。我想得到:

    na_column neg_column
    F            F
    F            T
    F            T
    T            F
    T            F
    F            F
    F            T
    T            F
    F            F
    F            F
    

    其中(is.na(cols))返回4、8、15。 它返回两列数组的索引列表,就好像它被展平成一行,列连接在一起一样。我想让它看看每一行,如果该行的任何一列包含na,那么返回该行号。我应该得到4,5,8。

    同样对于负值,我需要2,3,7。 我不知道该怎么做。看起来在R里应该很容易。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Tim Biegeleisen    8 年前

    尝试此选项:

    df <- data.frame(v1=c(1,NA,-3), v2=c(4,5,NA))
    rowSums(!is.na(df)) < ncol(df)
    [1] FALSE  TRUE  TRUE
    
    as.logical(rowSums(df < 0, na.rm=TRUE))
    [1] FALSE FALSE  TRUE
    

    数据:

      v1 v2
    1  1  4
    2 NA  5
    3 -3 NA
    

    Demo

        2
  •  2
  •   C. Braun    8 年前
    df$na_column <- is.na(rowSums(df))
    df$neg_column <- apply(df, 1, function(r) any(r < 0, na.rm = T))
    
    df
    #    V243  V247 na_column neg_column
    # 1   693   761     FALSE      FALSE
    # 2  -733   791     FALSE       TRUE
    # 3   665  -756     FALSE       TRUE
    # 4    NA   892      TRUE      FALSE
    # 5   821    NA      TRUE      FALSE
    # 6   752   819     FALSE      FALSE
    # 7  1092 -1137     FALSE       TRUE
    # 8    NA   943      TRUE      FALSE
    # 9   675   720     FALSE      FALSE
    # 10  600   645     FALSE      FALSE
    
        3
  •  0
  •   Bernhard    8 年前

    any all 功能在 R 是的,你想要什么。因此在R中很容易

    expl <- read.table(text="
              693   761
             -733   791
              665  -756
               NA   892
              821    NA
              752   819
             1092 -1137
               NA   943
              675   720
              600   645")
    
    apply(expl, 1, function(x) any(is.na(x)))
    apply(expl, 1, function(x) all(is.na(x)))