Использование которого и уникально в R - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть таблица со списком людей, каждый из которых имеет свой идентификатор.Идентификаторы дублируются 12 * n раз, и каждая строка содержит значение.Например:

table

Я хочу вычислять сумму этих значений каждые 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 в моей ежегодной колонке.Почему это так?Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Вы также можете использовать 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
0 голосов
/ 19 сентября 2018

Вот что вам нужно:

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

Отредактировано, чтобы ответить на вопрос, заданный в вашем комментарии (я не совсем понял, что вам нужно,так что осталось несколько вариантов на выбор!):

set.seed(1)
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
}
library("dplyr")
df<-df %>%
group_by(ID) %>% 
mutate(TotalSum= sum(Val),cumulativeSum=cumsum(Val),dif=TotalSum-lag   (cumulativeSum))
# View(df)
df$dif_withReplacedNAs<-df$dif
df[which(is.na(df$dif)),]$dif_withReplacedNAs <- df[which(is.na(df$dif)),]$TotalSum
head(df,16)
# ID      Val Yearly TotalSum cumulativeSum   dif dif_withReplacedNAs
# <fct> <dbl>  <dbl>    <dbl>         <dbl> <dbl>               <dbl>
#1 a        3.    85.     300.            3.   NA                 300.
#2 a        7.    85.     300.           10.  297.                297.
#3 a        3.    85.     300.           13.  290.                290.
#4 a       12.    85.     300.           25.  287.                287.
#5 a        7.    85.     300.           32.  275.                275.
#6 a        3.    85.     300.           35.  268.                268.
#7 a        8.    85.     300.           43.  265.                265.
#8 a        9.    85.     300.           52.  257.                257.
#9 a        8.    85.     300.           60.  248.                248.
#10 a        5.    85.     300.           65.  240.                240.
#11 a       12.    85.     300.           77.  235.                235.
#12 a        8.    85.     300.           85.  223.                223.
#13 a        4.   111.     300.           89.  215.                215.
#14 a       16.   111.     300.          105.  211.                211.
#15 a       10.   111.     300.          115.  195.                195.
#16 a        6.   111.     300.          121.  185.                185.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...