2016-11-15 2 views
0

У меня есть этот фрейм данных ДФ:подведение кадра данных по столбцам в 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)) 

Я хотел бы иметь возможность суммировать кадр данных ф.р. и подсчет и место процесса, с помощью столбцов, как показано ниже. Мне нужно знать, сколько процессов каждое приложение имеет группу по имени столбца. Как мне это сделать в 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)) 

ответ

1

Вы можете использовать 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 

Или, если предпочтительны позиции столбцов, позиции могут быть переданы .cols параметра:

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

Я получаю эту ошибку: не удалось найти функцию «summaryize» – user1471980

+0

Возможно, вы используете старую версию 'dplyr',' summaryizeat() 'функции введены в последней версии. – Psidom

+0

также, как бы изменить это, если имена столбцов не начинаются с процесса, скажем, я хочу сделать это на столбцах 2: 7? – user1471980

1

Вот метод, использующий 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 
позиции

или с использованием колонок вместо имен столбцов

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 

В случае, если это новый, вот быстрый прорыв вниз. lapply(.SD, sum, na.rm=TRUE) говорит sum с na.rm = TRUE по всем столбцам, .SDcols=3:7 или .SDcols=Process1:Process5 подмножает эту операцию на нужные столбцы, by=App группирует операцию.

Смежные вопросы