2015-09-07 283 views
3

我正在嘗試對將公司分類爲20個不同行業和800個類別的數據集進行分析。每個行業類別都有自己的專欄。下面是一個示例數據幀R - 按多列分組

df <- data.frame(biz.name=c("goog", "face", "eb"), worth=c(100, 200, 300), 
cat1=c("social", "social", "social"), cat2=c(NA, "search", "finance"), 
cat3=c(NA, NA, "commerce")) 

我想知道如何在不同類型的類別分析運行。例如,我將如何獲得不同類別的平均價值,即「社交」或「金融」。每家公司最多可以有20個類別(每行不重複)。

的dplyr包是我正常去到GROUP_BY方法,但鏈接似乎並不多列

cat.test <- df %>% 
    group_by(cat1:cat2) %>% 
    summarise (avg = mean(is.na(worth))) 

的代碼產生一個度量的企業每個排列與多個類別的組合工作,而不是單獨分類。在示例數據框架中,社交類別的總淨值應爲600,平均值爲300.

我已經查看了多個教程,但還沒有找到一個可以爲group_by多列的教程。謝謝,讓我知道如果我可以更清楚地提出這個問題。

[更新:編輯data.frame代碼]

+0

op!抱歉的人。我固定 – tom

+0

不應該是600和平均200. 600/3 = 200? – thelatemail

回答

3

我會用data.table這樣:

library(data.table) 
melt(setDT(df[-1]), id.vars='worth', value.name='category')[,.(worth=sum(worth)),category] 
# category worth 
#1: social 600 
#2:  NA 400 
#3: search 200 
#4: finance 300 
#5: commerce 300 
+0

偉大的代碼! (有一個額外的時期,供參考) – tom

3

我清理你的代碼,並能夠得到一個結果出來使用data.table包:

df <- data.frame(biz.name=c("goog", "face", "eb"), worth=c(100, 200, 300), 
       cat1=c("social", "social", "social"), cat2=c("NA", "search", "finance"), 
       cat3=c("NA", "NA", "commerce")) 

library(data.table) 
dt <- data.table(df) 
dt[, Mean:=mean(worth), by=list(cat1, cat2)] 

> dt 
    biz.name worth cat1 cat2  cat3 Mean 
1:  goog 100 social  NA  NA 100 
2:  face 200 social search  NA 200 
3:   eb 300 social finance commerce 300 
+0

我覺得OP需要融化'cat1/2/3'然後聚合。 – thelatemail

+0

@thelatemail所以用SQL術語來說,你應該說他應該將所有三列進行分組,然後從中取出一個集合,例如「mean」。 –

+0

它越來越近了。上述解決方案不太有效,因爲數據表不是按每個類別的唯一因素分組的。如果聚合和dplyr全部包含在單個列中,它們通常會這樣做。技巧是多列。如果在單獨的列中包含兩個常見的分類變量,則代碼將不得不認識到這一點。 – tom

3

使用tidyr,是這樣的:

library(tidyr) 
df %>% 
    gather(variable, category, -biz.name, -worth) %>% 
    group_by(category) %>% 
    summarise(worth=sum(worth)) 
#Source: local data frame [5 x 2] 
# 
# category worth 
#1 commerce 300 
#2 finance 300 
#3 search 200 
#4 social 600 
#5  NA 400 

這匹配你所要求的'社交'總和數字