如何获得包含NA OR值的两列矩阵中的行列表< 0?

时间:2018-06-04 13:52:19

标签: r

我有一个10行的两个(用于测试)列数组(cols)。例如。 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

如果ANY列在该行上包含NA,则希望获得具有T或F的一列10行向量,并且如果ANY列包含值<1,则希望获得具有T或F的另一个列10行向量。那一行是0。我想得到:

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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

尝试此选项:

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 :(得分:0)

anyallR中的功能可以满足您的需求。因此在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)))