在数据帧上查找最大值和最小值,忽略 NA

时间:2021-05-23 19:57:05

标签: r max min na operation

我需要像这样在数据帧“df”中找到最大值和最小值:

col1  col2  col3 
 7      4    5
 2      NA   6
 3      2    4
 NA     NA   1

结果应该是:min = 1,max = 7。 我用过这个功能:

min <- min(df, na.rm=TRUE)
max <- max(df, na.rm=TRUE)

但它给了我以下错误:

 Error in FUN(X[[i]], ...) : 
  only defined on a data frame with all numeric variables 

所以我以这种方式将所有值转换为.numeric:

df <- as.numeric(as.character(df))

但它通过强制引入了 NA,现在结果是: min = -Inf 和 max=Inf

如何在忽略 NA 的 df 上操作?

3 个答案:

答案 0 :(得分:4)

如果列不是numeric,则用type.convert进行转换

df <- type.convert(df, as.is = TRUE)

或者使用带有 matrix 路由的强制转换

df[] <- as.numeric(as.matrix(df))

或者用lapply

df[] <- lapply(df, function(x) as.numeric(as.character(x)))

使用 R 4.1.0 我们也可以做到

sapply(df, \(x) as.numeric(as.character(x))) |> 
   range(na.rm = TRUE)
#[1] 1 7

一旦列是 numeric,函数就会按预期工作

min(df, na.rm = TRUE)
#[1] 1
max(df, na.rm = TRUE)
#[1] 7

请注意,as.character/as.numeric 需要 vector 输入而不是 data.frame

答案 1 :(得分:2)

另一个基本的 R 选项

> range(na.omit(as.numeric(unlist(df))))
[1] 1 7

如果是 factor 类,你应该使用(感谢@akrun 的评论)

as.numeric(as.character(unlist(df)))

答案 2 :(得分:2)

我们可以使用 minMax 包中的 dataMaid 函数(处理 NA)

library(dataMaid)

minMax(df, maxDecimals = 2)

输出:

Min. and max.: 2; 7

数据:

df <- tribble(
~col1,  ~col2,  ~col3, 
7,      4,    5,
2,      NA,   6,
3,      2,    4,
NA,     NA,  1)