我需要像这样在数据帧“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 上操作?
答案 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)