2016-11-15 4 views
0

J'ai cette trame de données df:résumant la trame de données par des colonnes en R

df <- structure(list(App = structure(c(4L, 4L, 3L, 3L, 2L, 2L, 1L), .Label = c("DB", 
"End", "Mid", "Web"), class = "factor"), Server = structure(c(5L, 
6L, 1L, 2L, 3L, 4L, 7L), .Label = c("GServer101", "Hserver103", 
"JServer100", "Kserver200", "Server101", "Server102", "Xdb101" 
), class = "factor"), Process1 = c(1L, 5L, 1L, 1L, 1L, 1L, 1L 
), Process2 = c(1L, 1L, 1L, 4L, 1L, 1L, 1L), Process3 = c(NA, 
NA, NA, NA, NA, NA, NA), Process4 = c(NA, NA, NA, NA, NA, NA, 
NA), Process5 = c(NA, NA, NA, 1L, 1L, 1L, 1L)), .Names = c("App", 
"Server", "Process1", "Process2", "Process3", "Process4", "Process5" 
), class = "data.frame", row.names = c(NA, -7L)) 

Je voudrais être en mesure de résumer la trame de données df et compter et le processus de place par des colonnes comme ci-dessous. J'ai besoin de savoir combien de processus chaque application a un nom de groupe par colonne. Comment ferais-je cela en R?

end <- structure(list(App = structure(c(4L, 3L, 2L, 1L), .Label = c("DB", 
"End", "Mid", "Web"), class = "factor"), Process1 = c(6L, 2L, 
2L, 1L), Process2 = c(2L, 5L, 2L, 1L), Process3 = c(0L, 0L, 0L, 
0L), Process4 = c(0L, 0L, 0L, 0L), Process5 = c(0L, 1L, 2L, 1L 
)), .Names = c("App", "Process1", "Process2", "Process3", "Process4", 
"Process5"), class = "data.frame", row.names = c(NA, -4L)) 

Répondre

1

Vous pouvez utiliser dplyr:

library(dplyr) 
df %>% 
     group_by(App) %>% 
     summarize_at(vars(starts_with("Process")), funs(sum(., na.rm=TRUE))) 

# A tibble: 4 × 6 
#  App Process1 Process2 Process3 Process4 Process5 
# <fctr> <int> <int> <int> <int> <int> 
#1  DB  1  1  0  0  1 
#2 End  2  2  0  0  2 
#3 Mid  2  5  0  0  1 
#4 Web  6  2  0  0  0 

Ou si des positions de colonne sont préférés, les positions peuvent être transmises à .cols paramètre:

df %>% 
     group_by(App) %>% 
     summarize_at(.cols=3:7, funs(sum(., na.rm=TRUE))) 

# A tibble: 4 × 6 
#  App Process1 Process2 Process3 Process4 Process5 
# <fctr> <int> <int> <int> <int> <int> 
#1  DB  1  1  0  0  1 
#2 End  2  2  0  0  2 
#3 Mid  2  5  0  0  1 
#4 Web  6  2  0  0  0 
+0

Je reçois cette erreur: impossible de trouver la fonction "summarize_at" – user1471980

+0

Vous utilisez probablement l'ancienne version de 'dplyr', les fonctions' summarize_at() 'sont introduites dans la dernière version. – Psidom

+0

aussi, comment pourrais-je modifier cela si les noms de colonnes ne commencent pas par le processus, disons, je veux le faire sur les colonnes 2: 7? – user1471980

1

Voici une méthode utilisant data.table

library(data.table) 
# convert df to data.table 
setDT(df) 

df[, lapply(.SD, sum, na.rm=TRUE), .SDcols=Process1:Process5, by="App"] 
    App Process1 Process2 Process3 Process4 Process5 
1: Web  6  2  0  0  0 
2: Mid  2  5  0  0  1 
3: End  2  2  0  0  2 
4: DB  1  1  0  0  1 

ou en utilisant les positions des colonnes au lieu de noms de colonnes

df[, lapply(.SD, sum, na.rm=TRUE), .SDcols=3:7, by="App"] 
    App Process1 Process2 Process3 Process4 Process5 
1: Web  6  2  0  0  0 
2: Mid  2  5  0  0  1 
3: End  2  2  0  0  2 
4: DB  1  1  0  0  1 

Dans le cas où cela est nouveau, voici une pause rapide vers le bas. lapply(.SD, sum, na.rm=TRUE) indique sum avec na.rm = TRUE sur toutes les colonnes, .SDcols=3:7 ou .SDcols=Process1:Process5 sous-ensemble cette opération pour les colonnes souhaitées, by=App groupe l'opération.