Как агрегировать данные с разными датами и учитывать другие столбцы в R? - PullRequest
0 голосов
/ 05 марта 2019

Я хочу объединить dataframe строк TBCG2, когда DATA_INGRESSO_ORGAO отличается (см. ID_SERVIDOR_PORTAL номера столбцов 977, 1089, 1365, 1666, 2597, 2779 и 3036).Я хочу сохранить самую старую дату в соответствии с кодом ниже.Однако для ID 2789 у меня CARGO отличается для разных дат, и в этом случае я хочу сохранить две строки, изменив ID одной из них, добавив x в ID.То есть я хочу сохранить ID_SERVIDOR_PORTAL = 2789 и еще один ID_SERVIDOR_PORTAL = 2789x.Этот фрейм данных является только частью моей базы данных.Как мне поступить?

url=url("https://raw.githack.com/fsbmat/salarioDocente/master/Teste/TBCG2.csv")
TBCG2 <- read.csv2(url, header = TRUE,encoding = "ASCII")
TBCG2$DATA_INGRESSO_ORGAO <- as.Date(as.character(TBCG2$DATA_INGRESSO_ORGAO), format = "%d/%m/%Y")
>head(TBCG2)
  ID_SERVIDOR_PORTAL    NOME            CPF CARGO DATA_INGRESSO_ORGAO BRU_Jan2013
1                  3 MARGLIO ***.200.427-**  ETTB          2014-09-12          NA
2                  5 JACUIAR ***.614.234-**    SM          2016-06-20          NA
3                 12 ANDLEAL ***.609.150-**    SM          2012-11-13     7627.02
4                 69 GIZONCA ***.852.867-**    SM          2016-07-04          NA
5                 70 CARANNA ***.232.227-**    SM          1997-03-10    12360.61
6                 94 FERILVA ***.251.114-**  ETTB          2008-12-29     3703.82
  BRU_Fev2013 BRU_Mar2013
1          NA          NA
2          NA          NA
3     7627.02     8618.53
4          NA          NA
5    12360.61    13896.89
6     3703.82     4282.41
library(sqldf)
TBCG2 <- sqldf('select ID_SERVIDOR_PORTAL,NOME,CPF,CARGO,
                min(DATA_INGRESSO_ORGAO) as DATA_INGRESSO_ORGAO,
                sum(BRU_Jan2013 )   as  BRU_Jan2013,        
                sum(BRU_Fev2013 )   as  BRU_Fev2013,         
                sum(BRU_Mar2013 )   as  BRU_Mar2013
                from TBCG2 
                group by ID_SERVIDOR_PORTAL,NOME,CPF')

1 Ответ

0 голосов
/ 06 марта 2019

Очевидно, я получил решение, возможно, не самое быстрое из-за цикла, но важно то, что оно работало. Вот код:

url=url("https://raw.githack.com/fsbmat/salarioDocente/master/Teste/TBCG2.csv")
TBCG2 <- read.csv2(url, header = TRUE,encoding = "ASCII")
TBCG2$DATA_INGRESSO_ORGAO <- as.Date(as.character(TBCG2$DATA_INGRESSO_ORGAO), format = "%d/%m/%Y")
a <- c(NULL)
b <- c(NULL)
df <- TBCG2[duplicated(TBCG2$ID_SERVIDOR_PORTAL),]
ID <- df$ID_SERVIDOR_PORTAL
for (i in 1:length(ID)) {
  a[i] <- min((1:nrow(TBCG2))[TBCG2$ID_SERVIDOR_PORTAL==ID[i]])
  b[i] <- max((1:nrow(TBCG2))[TBCG2$ID_SERVIDOR_PORTAL==ID[i]])
  TBCG2$ID_SERVIDOR_PORTAL[a[i]] <- ifelse(TBCG2$ID_SERVIDOR_PORTAL[a[i]]==TBCG2$ID_SERVIDOR_PORTAL[b[i]]&TBCG2$CARGO[a[i]]==TBCG2$CARGO[b[i]],TBCG2$ID_SERVIDOR_PORTAL[a[i]],as.numeric(paste(TBCG2$ID_SERVIDOR_PORTAL[a[i]],"001",sep="")))
}
library(sqldf)
TBCG2 <- sqldf('select ID_SERVIDOR_PORTAL,NOME,CPF,CARGO,
                min(DATA_INGRESSO_ORGAO) as DATA_INGRESSO_ORGAO,
                sum(BRU_Jan2013 )   as  BRU_Jan2013,        
                sum(BRU_Fev2013 )   as  BRU_Fev2013,         
                sum(BRU_Mar2013 )   as  BRU_Mar2013
                from TBCG2 
                group by ID_SERVIDOR_PORTAL,NOME,CPF')
...