重写功能没有'而'或任何循环

时间:2017-09-07 16:33:33

标签: r

这是一个从airquality表返回多行的函数。行格式是包含最大温度值的日/月。如何在没有while或任何其他循环的情况下重写函数?

> head(airquality)
  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
> 

maxTemp_func <- function(days) {
    Myframe <- as.data.frame(airquality)
    l <- list()
    x <- 1 
    while (x <= days) {
        NewData <-  Myframe[Myframe[, "Temp"] == max(Myframe$Temp), ]
        mydata <- c("Month->", head( NewData[["Month"]], 1), "Day->", head( NewData[["Day"]], 1), "Temperature->", head(NewData[["Temp"]] , 1))
        l[[x]] <- mydata
        Myframe <- Myframe[!(Myframe$Temp == head( max(Myframe$Temp), 1)),]
        x <- x + 1
    }
    return(l)
}

2 个答案:

答案 0 :(得分:1)

使用dplyr返回每个月和每天的最高温度值。

library(dplyr)    
output <- airquality %>%
    group_by(Month, Day) %>%
    summarise(max_temp = max(Temp))

编辑:返回整个数据集的x最高温度。

N = {insert val here}
output <- airquality %>%
  group_by(Month, Day) %>%
  mutate(max_temp = max(Temp)) %>%
  arrange(desc(max_temp)) %>%
  ungroup() %>%
  slice(1:N)

答案 1 :(得分:0)

如果您正在寻找airquality中最热的日子,请执行以下操作:

maxTemp_func <- function(days) {
    temp_order <- order(-airquality[["Temp"]])
    airquality[temp_order[seq_len(days)], c("Month", "Day", "Temp")]
}

你的函数实际上没有这样做,因为它找到所有与最高温度相关的行,保存它们的第一行,然后删除所有行。因此,如果两行是最热的一天,其中一行不会是第二热门。