2017-05-25 60 views
0

如果我有一個簡單的數據框和2個因子(a和b)以及2個等級(1和2)和1個變量(x),我怎樣才能得到x :在因子a的每個水平上的中位數x,因子b的每個水平以及a * b的每個組合。R-dplyr對因素組合的總結

library(dplyr)  
df <- data.frame(a = as.factor(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)), 
    b = as.factor(c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)), 
    x = c(runif(16))) 

我已經試過各種(多)版本:

df %>% 
    group_by_(c("a", "b")) %>% 
    summarize(med_rate = median(df$x)) 

結果應該是這樣的中位數X因子的每個級別:

中位數
1 0.58811
2 0.53167

而像這樣的中位數X因子B的每個電平的:

b位數
1 0.60622
2 0.46096

而像這樣的中值X的每個組合a和b:

AB中位數
1 1 0.66745
1 2 0.34656
2 1 0.50903
2 2 0.55990

預先感謝任何幫助。

+0

採取'DF $'出來的'summarise' –

+0

你不需要引號,你可以使用'group_by'即'DF%>%GROUP_BY(A,B)%>%綜述(med_rate = median(x))' – akrun

+0

謝謝。但是這給了我一箇中位值;在16次觀測中的中位數x。它不給我每個因子(a和b)的每個等級(1和2)和每個a * b組合的每個等級的中值。 –

回答

0
set.seed(123) ##make your example reproducible 
require(data.table) 
df <- data.table(a = as.factor(c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)), 
      b = as.factor(c(1,1,1,1,2,2,2,2,1,1,1,1,2,2,2,2)), 
      x = c(runif(16))) 

df[, median(x), by = a] 
df[, median(x), by = b] 
df[, median(x), by = .(a,b)] 
+0

謝謝;但我得到一個錯誤消息,以響應每個「df [,median(x),by = z]命令:」unused argument(by = z)「 –

+0

你有一個名爲z的列? – simone

+0

不是。所以我不必重複錯誤消息3次:每次執行一次命令(by = a; by = b; by =。(a,b)。 –

0

以下不是很優雅,但會創建一個符合您預期結果的單個data.frame

我們正在創建三個數據data.frames(對於a,b和a * b)並將它們合併爲一個。

bind_rows(
    df %>% 
    group_by(a) %>% 
    rename(factor_g = a) %>% 
    summarize(med_rate = median(x)), 
    df %>% 
    group_by(b) %>% 
    rename(factor = b) %>% 
    summarize(med_rate = median(x)), 
    df %>% 
    # We create a column for grouping a*b 
    mutate(factor = paste(a, b)) %>% 
    group_by(factor) %>% 
    summarize(med_rate = median(x)) 
)