当R中存在NA时,将Min或Max函数应用于数组

时间:2015-02-16 15:20:33

标签: r max na

我有一个看似简单的问题,但真的让我发疯。我真的需要你的帮助。

首先让我们生成一些data.frame

a<-c(rep(1:2,2),NA,NA)
b<-c(rep(NA,3),3,4,NA)
df<-cbind(a,b)

这将给出一个表格:

      a  b
[1,]  1 NA
[2,]  2 NA
[3,]  1 NA
[4,]  2  3
[5,] NA  4
[6,] NA NA

现在我需要第三列:

  1. 当a和b都不是NA时,返回两者中的最大值。

  2. 当其中一个不是NA时,返回非NA号

  3. 当它们都是NA时,返回NA。

  4. 总结一下,我正在寻找这样的结果:

          a  b  c
    [1,]  1 NA  1
    [2,]  2 NA  2
    [3,]  1 NA  1
    [4,]  2  3  3
    [5,] NA  4  4
    [6,] NA NA NA
    

    我试过df$c<-max(df$a,df$b),显然这不起作用并给我:

    Error in df$a : $ operator is invalid for atomic vectors

    有人可以帮帮我吗?非常感谢!!

2 个答案:

答案 0 :(得分:1)

将数据集('df'为'矩阵')转换为'data.frame'后,您可以尝试pmax

cbind(df, c=do.call(`pmax`, c(as.data.frame(df), list(na.rm=TRUE))))
#      a  b  c
#[1,]  1 NA  1
#[2,]  2 NA  2
#[3,]  1 NA  1
#[4,]  2  3  3
#[5,] NA  4  4
#[6,] NA NA NA

如果您需要每行的“min”值,请将pmax替换为pmin。 要创建“data.frame”,您可以使用

df <- data.frame(a, b)

cbind将输出视为'矩阵'。 $运算符不支持'矩阵',因此最好使用[

答案 1 :(得分:1)

你也可以使用&#34;常规&#34; max功能:

df <- cbind(df, c = apply(df, 1, function(x) ifelse(all(is.na(x)), NA, max(x, na.rm=T))))

df
#      a  b  c
#[1,]  1 NA  1
#[2,]  2 NA  2
#[3,]  1 NA  1
#[4,]  2  3  3
#[5,] NA  4  4
#[6,] NA NA NA