2017-05-03 80 views
0

這感覺就像它不應該很難,但我一直在爭取它,卻無法找到符合我想我會問的答案。找到平均值最大的因素爲範圍

我有一個數據集,我想分解一個因子列,然後取平均值。這很容易。複雜的是,我想進一步限制這個意思只有在第二列的最大值的一定範圍內的值。

作爲一個例子,使用mtcars,我想平均hpdrat & wt由氣缸(cyl)分組,並且內的最大位移(disp)的50cc的的。

使用aggregate子集參數不適用於每個子集,它適用於整個數據集。所以,我們只能得到8缸汽車的正確平均,而不是4或6

aggregate(data=mtcars, cbind(hp, drat, wt) ~ factor(cyl), FUN=mean, subset=c(disp<=max(disp) & disp>=max(disp)-50)) 

#factor(cyl)  hp  drat  wt 
#1   8 216.6667 3.053333 5.339667 

使用by產生警告和NA

by(data=mtcars, mtcars$cyl, function(x) mean(subset(x, disp<=max(disp) & disp>=max(disp)-50), select = hp:wt)) 

Warning messages: 
1: In mean.default(subset(x, disp <= max(disp) & disp >= max(disp) - : 
    argument is not numeric or logical: returning NA 

我清楚地失去了一些東西。我正在尋找的是爲每個氣缸(4,6,8)返回一個數據幀,併爲每個氣缸排列前50cc的汽車的平均值爲hp,drat和wt。

回答

1

我覺得這確實使用dplyr的伎倆......

library(dplyr) 
data <- mtcars %>% group_by(cyl) %>% filter(max(disp)-disp<=50) %>% 
      summarise_each(funs="mean",hp,drat,wt) 

data 
# A tibble: 3 × 4 
    cyl  hp  drat  wt 
    <dbl>  <dbl> <dbl> <dbl> 
1  4 91.16667 3.950000 2.674167 
2  6 107.50000 2.920000 3.337500 
3  8 216.66667 3.053333 5.339667 
+0

謝謝!我必須找到時間學習'dplyr'。 – JHegg

+0

RStudio dplyr和tidyr備忘單是一個很好的起點 –

3

使用A基礎R方法拆分申請-結合的方法是

do.call(rbind, lapply(split(mtcars, mtcars$cyl), function(i) { 
     sapply(i[i$disp<=max(i$disp) & i$disp>=max(i$disp)-50, c("hp", "drat", "wt")], mean))) 
     hp  drat  wt 
4 91.16667 3.950000 2.674167 
6 107.50000 2.920000 3.337500 
8 216.66667 3.053333 5.339667 

這裏,數據被分成根據您的標準,通過cyl然後子集的data.frames列表。然後計算所需變量的平均值。使用do.call將結果列表綁定到data.frame中。

+0

謝謝!我提高了這一點,但選擇了Andrew的'dplyr'解決方案,因爲它更加簡潔。 – JHegg

1

爲了完整起見,這裏也是一個data.table解決方案。

的OP已經請求與行爲返回一個數據幀中的每個cylinder(4,6,8),並用平均爲hpdratwt僅在頂部50CC的每個組車列。因此,有兩個任務:

  1. 選擇汽車中符合條件的組

  • 總結相關列隨着data.table這成爲

    library(data.table) 
    mtcars <- as.data.table(mtcars) 
    mtcars[mtcars[, .I[disp >= max(disp) - 50], by = cyl]$V1, 
         lapply(.SD, mean), .SDcols = c("hp", "drat", "wt"), keyby = cyl] 
    
    cyl  hp  drat  wt 
    1: 4 91.16667 3.950000 2.674167 
    2: 6 107.50000 2.920000 3.337500 
    3: 8 216.66667 3.053333 5.339667 
    

    第一項任務是通過

    mtcars[, .I[disp >= max(disp) - 50], by = cyl]$V1 
    

    它返回滿足以下條件:爲每個組的頂部50CC的內汽車的行數來實現的。

    最後,所選行按照請求按組彙總。

    請注意setDT(mtcars)不能像往常一樣使用,因爲mtcars駐留在一個被鎖定的包中,以防止修改其變量綁定。

  • 相關問題