2017-06-11 2 views
1

Je travaille sur ma thèse avec peu de connaissance de r, donc la réponse à cette question peut être assez évidente.R: ligne de somme basée sur plusieurs conditions

J'ai l'un ensemble de données qui ressemble à ceci:

county<-c('1001','1001','1001','1202','1202','1303','1303') 
naics<-c('423620','423630','423720','423620','423720','423550','423720') 
employment<-c(5,6,5,5,5,6,5) 
data<-data.frame(county,naics,employment) 

Pour chaque comté, je veux résumer la valeur de l'emploi des lignes avec naics « 423620 » et « 423720 ». (Donc deux conditions: 1. même code de comté 2. ces deux codes naics) La ligne dans laquelle ils sont ajoutés devrait être la première ('423620'), et la seconde ('423720') devrait être enlevée

L'ensemble de données final devrait ressembler à ceci:

county2<-c('1001','1001','1202','1303','1303') 
naics2<-c('423620','423630','423620','423550','423720') 
employment2<-c(10,6,10,6,5) 
data2<-data.frame(county2,naics2,employment2) 

J'ai essayé de le faire moi-même avec un agrégat et rowSum, mais à cause des deux conditions, j'ai échoué jusqu'ici. Merci beaucoup.

Répondre

0

Nous pouvons faire

library(dplyr) 
data$naics <- as.character(data$naics) 

data %>% 
    filter(naics %in% c(423620, 423720)) %>% group_by(county) %>% 
    summarise(naics = "423620", employment = sum(employment)) %>% 
    bind_rows(., filter(data, !naics %in% c(423620, 423720))) 
# A tibble: 5 x 3 
# county naics employment 
# <fctr> <chr>  <dbl> 
#1 1001 423620   10 
#2 1202 423620   10 
#3 1303 423620   5 
#4 1001 423630   6 
#5 1303 423550   6 
0

Avec une telle condition, je voudrais tout d'abord écrire une petite aide et passe ensuite à dplyr muter:

# replace 423720 by 423620 only if both exist 
onlyThoseNAICS <- function(v){ 
    if(("423620" %in% v) & ("423720" %in% v)) v[v == "423720"] <- "423620" 
    v 
} 

data %>% 
    dplyr::group_by(county) %>% 
    dplyr::mutate(naics = onlyThoseNAICS(naics)) %>% 
    dplyr::group_by(county, naics) %>% 
    dplyr::summarise(employment = sum(employment)) %>% 
    dplyr::ungroup()