如何在R中查找数据帧中列的最大值?
我有以下数据框,我称之为臭氧:如何在R中查找数据帧中列的最大值?,r,max,R,Max,我有以下数据框,我称之为臭氧: 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
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
我想从臭氧
,太阳能.R
,风
中提取最高值
另外,如果可能的话,我将如何按降序排序Solar.R
或此数据帧的任何列
我试过了
max(ozone, na.rm=T)
这给了我数据集中最高的值
我也试过了
max(subset(ozone,Ozone))
但是got“子集”必须是逻辑的。“
我可以通过以下命令设置一个对象来保存每列的子集
ozone <- subset(ozone, Ozone >0)
max(ozone,na.rm=T)
臭氧(0)
最大值(臭氧,na.rm=T)
但它给出了相同的值334,这是数据帧的最大值,而不是列的最大值
任何帮助都会很好,谢谢。为了找到每列的最大值,您可以尝试使用
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
要获取任何列的最大值,请执行以下操作:
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)),]
与
colMeans
,colSums
等类似,您可以编写列最大值函数colMax
,以及列排序函数colSort
colMax <- function(data) sapply(data, max, na.rm = TRUE)
colSort <- function(data, ...) sapply(data, sort, ...)
对样本数据使用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
下面是一个
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))
更新:summary_each()
已被弃用,取而代之的是一个更具特色的函数系列:mutate_all()
,mutate_at()
,mutate_if(),summary_all()
,summary_at()
,summary_if()
以下是您可以做到的:
# find max for each column
ozone %>%
summarise_if(is.numeric, funs(max(., na.rm=TRUE)))%>%
arrange(Ozone)
或
另一种方法是使用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
max(ozone$ozone,na.rm=TRUE)
应该可以。记住要包括na.rm=TRUE
,否则R将返回na
max(may$Ozone, na.rm = TRUE)
如果没有$Ozone
,它将在整个数据帧中过滤,这可以在漩涡库中学习
我也在Coursera上学习这门课程~假设您在data.frame
中的数据被称为maxinozone
,您可以这样做
max(maxinozone[1, ], na.rm = TRUE)
尝试以下解决方案:
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 ...
Oz有一个包matrixStats
,它提供了一些函数来进行列和行汇总,请参见包中的,但是您必须将data.frame转换为矩阵
然后运行:colMaxs(as.matrix(ozone))
max(ozone$ozone)
或max(subset(ozone,select=ozone))
。您肯定应该看看一些关于数据帧列索引的介绍性R材料,这是您的基本问题。(这是一个coursera问题,对吗?)@BenBolker是的。顺便说一句,你是如何将你的评论变成灰色的。我使用了背景标记“``(我肯定这里有格式方面的帮助?)。谢谢!我正在github上关注你,顺便说一句,课程的名称是现在。它是@BenBolker:这里有一个-通过单击“帮助”始终可用“注释框旁边的链接。你能详细说明一下这里发生了什么吗?当然,请在控制台中输入?应用,然后继续操作。”。该函数具有以下参数:apply(X,MARGIN,FUN,…)
X
指的是您的数组,在本例中指的是数据帧<代码>边距
指定如何将函数应用于数据帧。例如,1
表示行,2
表示列FUN
是您希望应用于所选边距的功能。上面的答案创建了一个用户定义的函数,该函数在忽略NA值的情况下查找最大值。简言之,答案是在忽略NAs的情况下定位数据帧每列中的最大值。这很简单(+1),但值得注意的是,转换为“矩阵”,然后再转换回“data.frame”的速度很慢,pmax
失去了其速度优势。(apply
在“data.frame”上也较慢,原因相同)。例如,DF=as.data.frame(矩阵(样本(100,1e6,T),1e2,1e4))
<代码>微基准::微基准(sappy(DF,max),do.call(pmax,as.data.frame(t(DF)),apply(DF,2,max),unlist(lappy(DF,max)),as.matrix(DF),as.data.frame(t(DF)),times=20)
。另外,很抱歉,这里的评论很长(部分不相关),但我确实喜欢pmax
:)将您的输入强制为nums,因此lappy
可能更可取。@Frank-没错。我真的不再在这附近做什么了。请随意编辑,我将使其成为一个社区Wiki,以获得所有列的最大值,它也可以是:apply(ozone,2,max,na.rm=TRUE)
。对于较新的R版本。如果遇到警告消息:funs()
从dplyr 0.8.0开始不推荐使用。请使用函数或lambda的列表:以下lambda代码适用于我:ozone%>%summary\u if(is.numeric,list(~max(,na.rm=TRUE))
max(maxinozone[1, ], na.rm = TRUE)
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 ...