我想通过year
和ID
汇总我的费用。
以下是一些示例数据:
ID <- c(1,1,1,1,2,2,3,3)
year <- c(1,2,2,2,3,3,3,3)
cost <- c(1,1,2,3,2,2,2,2)
data = cbind(ID, year, cost)
这些信息应该保存在costs_year1
的costs_year2
,costs_year3
,ID
的附加栏目中。然后,我会删除其他列并删除重复的ID,以便我有一个宽的数据帧。
有什么建议可以做到这一点吗?
使用tidyverse
:
library(tidyverse)
ID <- c(1,1,1,1,2,2,3,3)
year <- c(1,2,2,2,3,3,3,3)
cost <- c(1,1,2,3,2,2,2,2)
data = data.frame(ID, year, cost)
data %>%
mutate(year = paste0("costs_year",year)) %>%
group_by(year,ID) %>%
summarize_at("cost",sum) %>%
spread(year,cost)
# # A tibble: 3 x 4
# ID costs_year1 costs_year2 costs_year3
# * <dbl> <dbl> <dbl> <dbl>
# 1 1 1 6 NA
# 2 2 NA NA 4
# 3 3 NA NA 4
%>%
被称为管道操作符,它来自包magrittr
,你可以使用它(例如)将tidyverse
与library(tidyverse)
连接后。
使用管道,您可以使用前一条指令的输出作为下一次调用的第一个参数,但示例将更好地教您。以下是如何在没有管道的情况下使其工作:
x <- mutate(data, year = paste0("costs_year",year))
x <- group_by(x,year,ID)
x <- summarize_at(x,"cost",sum)
spread(x,year,cost)
欲了解更多信息:What does %>% mean in R
使用dcast()
包装的reshape2
。
library(reshape2)
df.wide <- dcast(df1, ID ~ year, sum)
names(df.wide) <- c("ID", paste0("costs.year.", 1:3))
或者一步到位:
df.wide <- setNames(dcast(df1, ID ~ year, sum), c("ID", paste0("costs.year.", 1:3)))
生产
> df.wide
ID costs.year.1 costs.year.2 costs.year.3
1 1 1 6 0
2 2 0 0 4
3 3 0 0 4
数据
df1 <- structure(list(ID = c(1, 1, 1, 1, 2, 2, 3, 3), year = c(1, 2,
2, 2, 3, 3, 3, 3), cost = c(1, 1, 2, 3, 2, 2, 2, 2)), class = "data.frame", row.names = c(NA,
-8L))