2012-05-22 76 views
6

Tôi không hiểu tại sao tôi không thể tìm được giải pháp cho điều này, vì tôi cảm thấy đây là một câu hỏi khá cơ bản. Cần phải nhờ giúp đỡ. Tôi muốn sắp xếp lại bộ dữ liệu không khí theo tháng với giá trị tạm thời tối đa cho mỗi tháng. Ngoài ra, tôi muốn tìm ngày tương ứng cho mỗi nhiệt độ tối đa hàng tháng. Cách lười nhất (mã khôn ngoan) để làm điều này là gì?Chọn giá trị dựa trên giá trị cao nhất trong một cột khác

Tôi đã thử sau đây mà không một thành công:

require(reshape2) 
names(airquality) <- tolower(names(airquality)) 
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp")) 

dcast(mm, month + day ~ variable, max) 
aggregate(formula = temp ~ month + day, data = airquality, FUN = max) 

tôi sau khi một cái gì đó như thế này:

month day temp 
5  7 89 
... 

Trả lời

5

Đã có một cuộc thảo luận khá lâu về việc liệu lười biếng có tốt hay không. Anwyay, đây là ngắn và tự nhiên để viết và đọc (và là nhanh chóng cho dữ liệu lớn, do đó bạn không cần phải thay đổi hoặc tối ưu hóa nó sau này):

require(data.table) 
DT=as.data.table(airquality) 

DT[,.SD[which.max(Temp)],by=Month] 

    Month Ozone Solar.R Wind Temp Day 
[1,]  5 45  252 14.9 81 29 
[2,]  6 NA  259 10.9 93 11 
[3,]  7 97  267 6.3 92 8 
[4,]  8 76  203 9.7 97 28 
[5,]  9 73  183 2.8 93 3 

.SD là tập hợp con của dữ liệu cho từng nhóm, và bạn chỉ muốn hàng từ nó với Temp lớn nhất, iiuc. Nếu bạn cần số hàng thì có thể được thêm vào.

Hoặc để có được tất cả các hàng nơi tối đa được gắn:

DT[,.SD[Temp==max(Temp)],by=Month] 

    Month Ozone Solar.R Wind Temp Day 
[1,]  5 45  252 14.9 81 29 
[2,]  6 NA  259 10.9 93 11 
[3,]  7 97  267 6.3 92 8 
[4,]  7 97  272 5.7 92 9 
[5,]  8 76  203 9.7 97 28 
[6,]  9 73  183 2.8 93 3 
[7,]  9 91  189 4.6 93 4 
+0

Xin cảm ơn các bạn! Tôi đã không sử dụng gói data.table trước đây, do đó, nó về một thời gian. "Trả lời được chấp nhận" bởi vì cái này hoàn chỉnh nhất (và hơi ngắn hơn Chritoph_J). Tất cả các bạn sẽ xứng đáng với nó, mặc dù (1 cho tất cả mọi người). – Mikko

+0

Tôi tự hỏi nếu có một giải pháp súc tích hơn trong bất kỳ ngôn ngữ nào. Tôi đoán là không. –

2

thế nào về với plyr?

max.func <- function(df) { 
    max.temp <- max(df$temp) 

    return(data.frame(day = df$Day[df$Temp==max.temp], 
        temp = max.temp)) 
} 

ddply(airquality, .(Month), max.func) 

Như bạn có thể thấy, nhiệt độ tối đa cho tháng diễn ra trong hơn một ngày. Nếu bạn muốn có hành vi khác nhau, chức năng này đủ dễ điều chỉnh.

2

Hoặc nếu bạn muốn sử dụng gói data.table (ví dụ, nếu tốc độ là một vấn đề và tập dữ liệu là lớn hay nếu bạn thích cú pháp):

library(data.table) 
DT <- data.table(airquality) 
DT[, list(maxTemp=max(Temp), dayMaxTemp=.SD[max(Temp)==Temp, Day]), by="Month"] 

Nếu bạn muốn biết những gì .SD là viết tắt của, có một cái nhìn ở đây: SO

+0

Tôi nghĩ bạn đã đánh tôi trên cái đó :) –

+0

Thời gian khôn ngoan, có, bằng hai giây (thời gian để ăn mừng ;-) Nhưng mẹo 'which.max' của bạn là gọn gàng ... vì vậy +1 cho điều đó! –

3

Một cách tiếp cận với plyr

require(reshape2) 
names(airquality) <- tolower(names(airquality)) 
mm <- melt(airquality, id.vars = c("month", "day"), meas = c("temp"), value.name = 'temp') 

library(plyr) 

ddply(mm, .(month), subset, subset = temp == max(temp), select = -variable) 

Cho

month day temp 
1  5 29 81 
2  6 11 93 
3  7 8 92 
4  7 9 92 
5  8 28 97 
6  9 3 93 
7  9 4 93 

Hoặc, thậm chí đơn giản hơn

require(reshape2) 
require(plyr) 
names(airquality) <- tolower(names(airquality)) 
ddply(airquality, .(month), subset, 
    subset = temp == max(temp), select = c(month, day, temp)) 
Các vấn đề liên quan