根据R中的年份和ID进行汇总

问题描述 投票:-1回答:2

我想通过yearID汇总我的费用。

以下是一些示例数据:

   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_year1costs_year2costs_year3ID的附加栏目中。然后,我会删除其他列并删除重复的ID,以便我有一个宽的数据帧。

有什么建议可以做到这一点吗?

r sum aggregate
2个回答
2
投票

使用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,你可以使用它(例如)将tidyverselibrary(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


0
投票

使用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))
© www.soinside.com 2019 - 2024. All rights reserved.