如何在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
我想从ozone
、Solar.R
、Wind
...中提取最高值...
另外,如果可能的话,我将如何按降序对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】:
类似于colMeans
、colSums
等,您可以编写列最大值函数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 %>% 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中的数据框中找到列的最大值?的主要内容,如果未能解决你的问题,请参考以下文章