2014-12-03 61 views
2

這是我在StackOverflow上的第一個問題。我將盡我所能使它簡明扼要,如果不是,我很抱歉。我也是R的新手。我在StackOverflow上瀏覽了一下我的問題的答案。我發現了一些有用的東西,但我不確定哪些方法最適合使用,或者如何將它們組合在一起以使其工作。基於另一列中的行子集取得多個列的最大值

我有一個這樣的數據集,名爲「PER1」

Day Stat1 Stat2 Stat3 
    10 2.12 1.84 2.11 
    10 2.09 1.87 2.07 
    10 2.08 1.92 2.07 
    11 1.90 1.85 1.88 
    11 1.87 1.85 1.93 
    11 1.86 1.87 1.93 

我想要做的就是找到數據的每一天每一個「統計」一欄的最大值是什麼。換句話說,每列中計算最大值的行是在「日」列中包含相同值的行。輸出將如下所示:

Day MaxStat1 MaxStat2 MaxStat3 
10 2.12  1.92  2.11 
11 1.87  1.87  1.93 

我想打一個循環,定義了在日列中唯一值的數量,然後使用該定義的最大將從每列來計算的行。但我堅持如何根據獨特的日子將最大函數獲取到每列中的子集行。我至今很粗糙,我甚至不能確定它遵循正確的[R規則(再次,新R)

days <- unique(per1$Day) 
stations <- per1[,1:3] 
l <- length(days) 
for (k in 1:l) { 
curr_day <- subset(per1, per1$Day == days[k]) ##this defines the individual day 
curr_stn <- stations[curr_day,] ##this is supposed to define the number of rows as the number of rows in curr_day 
for(i in 1:stations) { ##loop over each column 
max[i] <- max(stations[curr_day,curr_stn]) ##take the maximum for each column based on the number of rows for each curr_day 
} 
} 

我也得到

Error in stations[curr_day, ] : subscript out of bounds 

所以我想這意味着我的天堂沒有正確定義我的論點。如果任何人可以幫助我與這個循環適當的格式,這將非常感激!任何其他更清潔/更快的方法也將受到歡迎。 (我看着「mapply」,但無法弄清楚如何編寫定義Stat列的行數的函數作爲每個獨特Day的行數)

謝謝你的時間。

回答

2

這是一個簡單的分組計算。困難的部分已經爲我們完成了。我們可以使用aggregate

aggregate(. ~ Day, per1, max) 
# Day Stat1 Stat2 Stat3 
# 1 10 2.12 1.92 2.11 
# 2 11 1.90 1.87 1.93 
+0

我喜歡這是一個內置的R命令,而不必進入不同的包。你介意解釋一下「」。和「〜」是爲了什麼?我假設他們以某種方式表明了論點? – abishop 2014-12-04 12:59:52

+0

我想到「。」表示整個數據幀,但我不熟悉「〜」作爲元字符。 – abishop 2014-12-04 13:05:46

1

R的最好的部分是不必做循環!試試這個:

library(dplyr) 
maxdat <- per1 %>% 
      group_by(Day) %>% 
      summarise_each(funs(max)) 
+0

工作正常,謝謝!你介意解釋%>%運算符嗎?我假設group_by,summarise_each和funs函數是dplyr包的一部分? – abishop 2014-12-04 12:49:02

+1

@abishop它被稱爲「管道」,雖然它在dplyr包中,但它來自它自己的名爲'magrittr'的包。它將一個函數的結果傳遞給下一個函數,允許您將函數鏈接在一起,而無需將每個步驟保存在變量中,或者在函數中包含函數。這個很酷。 – Nick 2014-12-04 18:07:43

0

更新使用dplyr尼克的回答是:

summarise_each()已被棄用,由summarise_all()取代。相關dplyr發行說明,https://github.com/tidyverse/dplyr/releases/tag/v0.7.0

per1 <- data.frame(Day = c(10, 10, 10, 11, 11, 11), 
        stat1 = rnorm(6), 
        stat2 = runif(6), 
        stat3 = 1:6) 

per1 
## Day  stat1  stat2 stat3 
## 1 10 0.5172806 0.14336084  1 
## 2 10 -0.5693747 0.10477538  2 
## 3 10 -0.3351060 0.77701780  3 
## 4 11 -0.1472232 0.28173915  4 
## 5 11 0.5093479 0.65901061  5 
## 6 11 -1.8770271 0.02960309  6 

library(dplyr) 
maxdat <- per1 %>% 
      group_by(Day) %>% 
      summarise_all(max) 

maxdat 
## # A tibble: 2 x 4 
##  Day stat1 stat2 stat3 
## <dbl> <dbl> <dbl> <dbl> 
## 1 10.0 0.517 0.777 3.00 
## 2 11.0 0.509 0.659 6.00 
相關問題