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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据R中的年份和ID进行汇总相关的知识,希望对你有一定的参考价值。

我想通过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,以便我有一个宽的数据帧。

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

答案

使用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

另一答案

使用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))

以上是关于根据R中的年份和ID进行汇总的主要内容,如果未能解决你的问题,请参考以下文章

仅根据月份和年份选择 mySQL

在MySql中、怎样根据年份或者月份查询数据表中的数据?

在MySql中、怎样根据年份或者月份查询数据表中的数据?

如何根据单独列中的月份和年份参数对 DB2 结果进行排序

关于使用python脚本将同级的其他目录下的所有文件根据年份移动到当脚本位置的年份目录

如何在 Android 中的特定片段容器中显示片段