2017-07-24 69 views
1

具有列標識,列類別,列成本和列顏色的數據框。如何使用dplyr聚合數據幀的多個列

這裏是DF

library(dplyr) 

id <- c(1, 1, 1, 2, 2, 3, 1) 
category <- (c("V", "V", "V", "W", "W", "W", "W")) 
cost <- c(10, 15, 5, 2, 14, 20, 3) 
colour <- c("red", "green", "red", "green", "blue","blue","blue") 

df <- data.frame(id, category, cost, colour) 
df$category <- as.character(df$category) 

df 
id category cost  colour 
1  V   10  red 
1  V   15  green 
1  V   5  red 
2  W   2  green 
2  W   14  blue 
3  W   20  blue 
1  W   3  blue 

數據框這裏是DF格式

'data.frame': 7 obs. of 4 variables: 
$ id  : num 1 1 1 2 2 3 1 
$ category : chr "V" "V" "V" "W" ... 
$ cost: num 10 15 5 2 14 20 3 
$ colour : Factor w/ 3 levels "blue","green",..: 3 2 3 2 1 1 1 

我想有一個新的數據幀df_new和每個ID的頻率(頻率)時,條目相等的類別條目的數量W(category_W),條目相等的類別條目的數量V(category_V),類別條目爲W(cost_W)的每個id的總成本,每個條目的總成本id類別條目是V(cost_V),並且每個唯一id是numbe每個顏色條目的顏色(col_red,col_green,col_blue)。 輸出應該看起來像

id freq category_W category_V cost_W cost_V col_red col_green col_blue 
1 4  1    3    3  30  2   1  1  
2 2  2       16        1  1 
3 1  1       20          1 

我嘗試了以下 - 但它不起作用。

df_new <- group_by(df, id) %>% summarize(freq = count(id), category_W = count(category == "W", na.rm=TRUE), category_V = count(category == "V", na.rm=TRUE), col_red = count(colour == "red", na.rm=TRUE), col_green = count(colour == "green", na.rm=TRUE), col_blue = count(colour == "blue", na.rm=TRUE))  

我不知道如何插入cost_W和cost_V的條件。 我得到的錯誤:長度(行)== 1不是TRUE 非常感謝!

+0

什麼是數據幀中的「頻率」?你的意思是「成本」? – Sotos

+0

對不起,你當然是對的,我把它改正了成本。 – hsteini

+0

我想你只需要添加到您的代碼:total_cost_w = sum(cost_W),如果我udnerstand您的帖子正確... – cremorna

回答

0

那麼,你幾乎在那裏。

您可以利用邏輯值在算術運算中轉換爲0和1的事實。所以當你總結他們時,你會得到邏輯子句所測試的特定值的數量。

您可以使用相同的屬性來計算成本。只需將邏輯子句與成本變量相乘即可。如果類別符合您的興趣,則將其加起來,否則將其減爲0

df_new <- 
    group_by(df, id) %>% summarize(
     freq = n(), 
     category_W = sum(category == "W", na.rm = TRUE), 
     category_V = sum(category == "V", na.rm = TRUE), 
     cost_W = sum((category == "W") * cost, na.rm = TRUE), 
     cost_V = sum((category == "V") * cost, na.rm = TRUE), 
     col_red = sum(colour == "red", na.rm = TRUE), 
     col_green = sum(colour == "green", na.rm = TRUE), 
     col_blue = sum(colour == "blue", na.rm = TRUE) 
) 
+0

Zielinski,謝謝你很多幫助和你的理解解釋! – hsteini

相關問題