如何使用dplyr聚合数据帧的多个列
问题描述:
具有列标识,列类别,列成本和列颜色的数据框。如何使用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和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
什么是数据帧中的“频率”?你的意思是“成本”? – Sotos
对不起,你当然是对的,我把它改正了成本。 – hsteini
我想你只需要添加到您的代码:total_cost_w = sum(cost_W),如果我udnerstand您的帖子正确... – cremorna