聚集具有唯一ID和列

时间:2019-08-22 15:22:42

标签: r aggregate

我有ID,其中包含每年的数据,但是这些年在各列中重复出现:

array_column()

以及我每年需要对数据进行汇总并获得如下所示的信息:

test1<-data.frame(
  ID=c("P1","P1","P2","P2","P1","P2","P1","P1") , 
  YEAR1 =c(10,30,50,40,50,45,12,8), 
  YEAR2=c(40,20,30,10,50,30,60,10), 
  YEAR3=c(300,200,170,150,150,120,90,100), 
  YEAR2= c(100,10,20,30,50,60,40,80))

我已经尝试过result <- data.frame( ID=c("P1","P2") , YEAR1 =c(110,135), YEAR2=c(460,180), YEAR3=c(840,440)) result # ID YEAR1 YEAR2 YEAR3 #1 P1 110 460 840 #2 P2 135 180 440

aggregate

但是我的问题是不能将相等的年数相加,也许是因为现在的年数是一个属性?

3 个答案:

答案 0 :(得分:0)

base R中的一个选项是根据列名的相似性将数据拆分为list的data.frames,并在aggregate内执行listReduce,方法是merge和公用的“ ID”列

lst1 <- lapply(split.default(test1[-1], 
     sub("\\.\\d+$", "", names(test1)[-1])), function(x) 
     aggregate(.~ ID, cbind(test1[1], colN = unlist(x)), sum))
lst1 <-  Map(function(x, y, z) setNames(x, c(y, z)), lst1, "ID", names(lst1))

Reduce(function(...) merge(..., by = "ID"), lst1)
#    ID YEAR1 YEAR2 YEAR3
#1 P1   110   460   840
#2 P2   135   180   440

此外,如果只有一个重复的列,则只需

transform(aggregate(.~ ID, test1, sum), YEAR2 = YEAR2 + YEAR2.1)[-5]
#   ID YEAR1 YEAR2 YEAR3
#1 P1   110   460   840
#2 P2   135   180   440

答案 1 :(得分:0)

您可以尝试这样的事情:

library(tidyverse)
test1 %>% 
  gather(key = "yr", value = "value", -ID) %>% 
  mutate(yr = str_remove(yr, "\\.\\d+")) %>% 
  group_by(ID, yr) %>% 
  summarize(value = sum(value))

  ID    yr    value
  <fct> <chr> <dbl>
1 P1    YEAR1   110
2 P1    YEAR2   460
3 P1    YEAR3   840
4 P2    YEAR1   135
5 P2    YEAR2   180
6 P2    YEAR3   440

collect操作将创建一个包含三列的修改后的数据框:ID,年份和值。然后,您可以修改年份列,以从重复的列名称中删除.1.2等,并执行汇总操作以获取ID和年份的总数。

答案 2 :(得分:0)

一旦获得了列名的第一部分(ID除外),就可以对相关列进行子集化,将各行加在一起,然后使用tapply将结果值加{ {1}}。

ID