如何在R中的数据框中找到列的最大值?

Posted

技术标签:

【中文标题】如何在R中的数据框中找到列的最大值?【英文标题】:How to find the highest value of a column in a data frame in R? 【发布时间】:2014-08-04 10:49:37 【问题描述】:

我有以下数据框,我称之为臭氧:

   Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
5     NA      NA 14.3   56     5   5
6     28      NA 14.9   66     5   6
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9

我想从ozoneSolar.RWind...中提取最高值...

另外,如果可能的话,我将如何按降序对Solar.R 或此数据框的任何列进行排序

我试过了

max(ozone, na.rm=T)

这给了我数据集中的最高值。

我也试过了

max(subset(ozone,Ozone))

但得到"subset" must be logical."

我可以通过以下命令设置一个对象来保存每一列的子集

ozone <- subset(ozone, Ozone >0)
max(ozone,na.rm=T) 

但它给出了相同的值 334,这是数据框的最大值,而不是列。

任何帮助都会很棒,谢谢。

【问题讨论】:

max(ozone$Ozone)max(subset(ozone,select=Ozone))。你绝对应该看一些关于数据帧列索引的介绍性 R 材料,这是你的基本问题。 (这是一个 coursera 问题,对吧?github.com/ahawker/data-analysis-coursera/blob/master/HW1/hw1.R) @BenBolker 是的。顺便说一句,您是如何将评论中的部分变灰的。 我使用了反引号``(我确定这里有格式化帮助吗?) 谢谢!我在 github 上关注你,顺便说一句,课程名称现在是 R Programming。它是"Data Specialization Track" 的一部分 @BenBolker:这里有一个link to SO comment formatting - 单击评论框旁边的“帮助”链接始终可用。 【参考方案1】:

类似于colMeanscolSums 等,您可以编写列最大值函数colMax 和列排序函数colSort

colMax <- function(data) sapply(data, max, na.rm = TRUE)
colSort <- function(data, ...) sapply(data, sort, ...)

我在第二个函数中使用了...,希望能激发你的兴趣。

获取您的数据:

dat <- read.table(h=T, text = "Ozone Solar.R Wind Temp Month Day
1     41     190  7.4   67     5   1
2     36     118  8.0   72     5   2
3     12     149 12.6   74     5   3
4     18     313 11.5   62     5   4
5     NA      NA 14.3   56     5   5
6     28      NA 14.9   66     5   6
7     23     299  8.6   65     5   7
8     19      99 13.8   59     5   8
9      8      19 20.1   61     5   9")

对样本数据使用colMax函数:

colMax(dat)
#  Ozone Solar.R    Wind    Temp   Month     Day 
#   41.0   313.0    20.1    74.0     5.0     9.0

要对单列进行排序,

sort(dat$Solar.R, decreasing = TRUE)
# [1] 313 299 190 149 118  99  19

所有列都使用我们的colSort 函数,

colSort(dat, decreasing = TRUE) ## compare with '...' above

【讨论】:

将整数强制转换为数字,因此lapply 可能更可取。 @Frank - 没错。我不再在这里做太多事情了。随意编辑,我会把它变成一个社区维基【参考方案2】:

要获得您想要的任何列的最大值:

max(ozone$Ozone, na.rm = TRUE)

要获得所有列的最大值,您需要:

apply(ozone, 2, function(x) max(x, na.rm = TRUE))

然后排序:

ozone[order(ozone$Solar.R),]

或者换个方向排序:

ozone[rev(order(ozone$Solar.R)),]

【讨论】:

获取所有列的最大值,也可以是:apply(ozone, 2, max, na.rm = TRUE)【参考方案3】:

这是dplyr 解决方案:

library(dplyr)

# find max for each column
summarise_each(ozone, funs(max(., na.rm=TRUE)))

# sort by Solar.R, descending
arrange(ozone, desc(Solar.R))

更新: summarise_each() 已被弃用,取而代之的是更有特色的函数系列:mutate_all()mutate_at()mutate_if()summarise_all()summarise_at()、@987654329 @

你可以这样做:

# find max for each column
ozone %>%
         summarise_if(is.numeric, funs(max(., na.rm=TRUE)))%>%
         arrange(Ozone)

ozone %>%
         summarise_at(vars(1:6), funs(max(., na.rm=TRUE)))%>%
         arrange(Ozone)

【讨论】:

适用于较新的 R 版本。如果您遇到警告消息:funs() 自 dplyr 0.8.0 起已弃用。请使用函数或 lambda 列表:以下 lambda 代码对我有用:ozone %&gt;% summarise_if(is.numeric, list(~ max(., na.rm=TRUE)))【参考方案4】:

为了找到每列的最大值,您可以尝试使用apply() 函数:

> apply(ozone, MARGIN = 2, function(x) max(x, na.rm=TRUE))
  Ozone Solar.R    Wind    Temp   Month     Day 
   41.0   313.0    20.1    74.0     5.0     9.0 

【讨论】:

你能详细说明这里发生了什么吗? 当然,请在您的控制台中输入?apply 进行后续操作。该函数具有以下参数:apply(X, MARGIN, FUN, ...)X 指的是您的数组,或者在这种情况下是数据框。 MARGIN 指定您希望如何将函数应用于数据框。例如,1 表示行,而2 表示列。 FUN 是您希望在您选择的MARGIN 上应用的功能。上面的答案创建了一个用户定义的函数,该函数在忽略 NA 值的情况下找到最大值。简而言之,答案在忽略 NA 的情况下定位数据框每一列中的最大值。【参考方案5】:

另一种方法是使用 ?pmax

do.call('pmax', c(as.data.frame(t(ozone)),na.rm=TRUE))
#[1]  41.0 313.0  20.1  74.0   5.0   9.0

【讨论】:

这很简洁(+1),但值得注意的是,转换为“矩阵”然后再转换回“data.frame”很慢,pmax 失去了速度优势。 (出于同样的原因,apply 在“data.frame”上也较慢)。例如。 DF = as.data.frame(matrix(sample(100, 1e6, T), 1e2, 1e4)) ; microbenchmark::microbenchmark(sapply(DF, max), do.call(pmax, as.data.frame(t(DF))), apply(DF, 2, max), unlist(lapply(DF, max)), as.matrix(DF), as.data.frame(t(DF)), times = 20)。附:抱歉,这里有很长的(部分不相关的)评论,但我喜欢pmax :)【参考方案6】:
max(may$Ozone, na.rm = TRUE)

没有$Ozone会过滤整个数据框,这个可以在swirl库中学习。

我也在 Coursera 上学习这门课程~

【讨论】:

【参考方案7】:

有一个包matrixStats 提供了一些函数来做列和行摘要,请参见包vignette,但你必须将你的data.frame 转换为矩阵。

然后你运行:colMaxs(as.matrix(ozone))

【讨论】:

【参考方案8】:

假设您在data.frame 中的数据称为maxinozone,您可以这样做

max(maxinozone[1, ], na.rm = TRUE)

【讨论】:

【参考方案9】:

max(ozone$Ozone, na.rm = TRUE) 应该可以解决问题。请记住包含na.rm = TRUE,否则 R 将返回 NA。

【讨论】:

【参考方案10】:

试试这个解决方案:

Oz<-subset(data, data$Month==5,select=Ozone) # select ozone  value in the month of                 
                                             #May (i.e. Month = 5)
summary(T)                                   #gives caracteristics of table( contains 1 column of Ozone) including max, min ...

【讨论】:

以上是关于如何在R中的数据框中找到列的最大值?的主要内容,如果未能解决你的问题,请参考以下文章

报告pyspark数据框中列的前3个最大值[重复]

如何从 Python 3.5 中的数据框中找到最大值的确切位置-修改

如何找到R中分类列的平均值[关闭]

如何获得每列的最大值?

根据火花数据框中另一列的值查找列的最大值?

如何在熊猫数据框中找到每个月的“n”个最大值? [复制]