我有一张桌子,上面有一个人的名单,每个人都有不同的ID。 ID被复制12 * n次,每行包含一个值。例如:
我想每12个月计算一次这些值的总和,即来自行2:13、14:25等的值总和,以及我的数据表中每个人的总和。
我已经做到了,但是似乎没有用。
for (i in unique(new_table[,"ID"])){
n<-data[n_pers,9]*12 # n differs for each person and is obtained from another table
for (t in 0:n) {
new_table$yearly<-sum(new_table[which(new_table$ID==i),][t*12+1:min(n,(t+1)*12+1) ,"Values"])
}}
没有错误产生。但是,我的年度列中仅包含NA。为什么呢?任何帮助将不胜感激。
答案 0 :(得分:1)
这是您需要的:
android:checked="@={viewmodel.isSwitchChecked()}"
进行测试:
ID<-c(rep("a",36),rep("b",60));Val<-round(rnorm(96,15,4),digits=0)
df<-as.data.frame(cbind(ID,Val))
df$Val<-as.numeric(df$Val)
Yearly<-NULL
df$Yearly<-0
library("zoo")
for(i in unique(df$ID)){
Yearly<-rep(rollapply(df[which(df$ID==i),]$Val, 12, sum, by = 12),
rep(12,nrow(df[which(df$ID==i),])%/%12))
df[which(df$ID==i),]$Yearly<-Yearly
}
经过编辑,可以回答您评论中提出的问题(我不太清楚您需要什么,因此给您几个选择的机会!):
sum(df[12,]$Val)
#[1] 102
head(df,12)
# ID Val Yearly
#1 a 6 102
#2 a 9 102
#3 a 12 102
#4 a 5 102
#5 a 19 102
#6 a 12 102
#7 a 10 102
#8 a 4 102
#9 a 7 102
#10 a 4 102
#11 a 8 102
#12 a 6 102
答案 1 :(得分:0)
您还可以使用dplyr
获得所需的内容。这里的技巧是在这里创建新的分组变量year_index
。或将其调整为所需的任何时间间隔。
df <- data.frame(ID = c("a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "a", "b", "b"), Val = c(13, 12, 11, 14, 15, 6, 13, 12, 1, 9, 10, 5, 1,2,3,4,5,6,7,8,9,10,11,12,1,2))
library(dplyr)
df <- df %>%
group_by(ID) %>%
mutate(year_index = ((1:n() -1) %/% 12) + 1) %>%
group_by(year_index) %>%
mutate(sum = sum(Val))
# A tibble: 26 x 4
# Groups: month_index [2]
ID Val month_index sum
<fct> <dbl> <dbl> <dbl>
1 a 13 1 124
2 a 12 1 124
3 a 11 1 124
4 a 14 1 124
5 a 15 1 124
6 a 6 1 124
7 a 13 1 124
8 a 12 1 124
9 a 1 1 124
10 a 9 1 124
11 a 10 1 124
12 a 5 1 124
13 a 1 2 78
14 a 2 2 78
15 a 3 2 78
16 a 4 2 78
17 a 5 2 78
18 a 6 2 78
19 a 7 2 78
20 a 8 2 78
21 a 9 2 78
22 a 10 2 78
23 a 11 2 78
24 a 12 2 78
25 b 1 1 124
26 b 2 1 124