繁体   English   中英

R中不存在NA时将最小值或最大值函数应用于数组

[英]Apply Min or Max function to arrays when NA exist in R

我有一个问题看起来很简单,但确实使我发疯。 我真的需要你的帮助。

首先让我们生成一些数据

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。

总而言之,我正在寻找这样的结果:

      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

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

您可以在将数据集(“ 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

如果您需要每一行的“最小值”值,请用pmin替换pmax 要创建一个“ data.frame”,您可以使用

df <- data.frame(a, b)

cbind将输出作为“矩阵”。 $运算符不适用于'matrix',因此最好使用[

您还可以使用“常规” 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM