我有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
但是我的问题是不能将相等的年数相加,也许是因为现在的年数是一个属性?
答案 0 :(得分:0)
base R
中的一个选项是根据列名的相似性将数据拆分为list
的data.frames,并在aggregate
内执行list
和Reduce
,方法是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