2015-05-13 5 views
5

У меня есть кадр данных с двумя столбцами. Я хочу добавить еще два столбца в набор данных с подсчетами на основе агрегатов.Агрегирование в R

df <- structure(list(ID = c(1045937900, 1045937900), 
SMS.Type = c("DF1", "WCB14"), 
SMS.Date = c("12/02/2015 19:51", "13/02/2015 08:38"), 
Reply.Date = c("", "13/02/2015 09:52") 
), row.names = 4286:4287, class = "data.frame") 

Я хочу просто подсчитать количество экземпляров SMS.Type и Reply.Date, где нет нулей. Итак, в приведенном ниже примере игрушек я сгенерирую 2 для SMS.Type и 1 для Reply.Date

Затем я хочу добавить это в фрейм данных как общее количество (Im известно, что они будут дублировать количество строки в исходном наборе данных, но тот ОК)

Я играл вокруг с совокупным и кол-функции, но безрезультатно

mytempdf <-aggregate(cbind(testtrain$SMS.Type,testtrain$Response.option)~testtrain$ID, 
        train, 
        function(x) length(unique(which(!is.na(x))))) 

mytempdf <- aggregate(testtrain$Reply.Date~testtrain$ID, 
        testtrain, 
        function(x) length(which(!is.na(x)))) 

Может кто-нибудь помочь?

Спасибо за ваше время

ответ

5

Использование data.table вы могли бы сделать (я добавил реальный NA в исходные данные). Я также не уверен, действительно ли вы ищете length(unique()) или просто length?

library(data.table) 
cols <- c("SMS.Type", "Reply.Date") 
setDT(df)[, paste0(cols, ".count") := 
        lapply(.SD, function(x) length(unique(na.omit(x)))), 
        .SDcols = cols, 
      by = ID] 
#   ID SMS.Type   SMS.Date  Reply.Date SMS.Type.count Reply.Date.count 
# 1: 1045937900  DF1 12/02/2015 19:51    NA    2    1 
# 2: 1045937900 WCB14 13/02/2015 08:38 13/02/2015 09:52    2    1 

В версии разви (v> = 1.9.5), вы также можете использовать uniqueN функция


Объяснение

Это общее решение, которое будет работать на любом количестве нужных столбцов. Все, что вам нужно сделать, это поместить имена столбцов в cols.

  1. lapply(.SD, называет определенную функцию по столбцам, указанных в .SDcols = cols
  2. paste0(cols, ".count") создает новые имена столбцов при добавлении count к именам столбцов, указанных в cols
  3. := выполняет назначения по ссылке, смысл, обновление вновь созданные столбцы с выходом lapply(.SD,на месте
  4. аргумент с указанием агрегатор столбцов
+0

Привет Давид, спасибо за введение меня data.table ... Можете ли вы объяснить, что каждая линия делает из SetDT вперед, если у вас есть время. Чтобы ответить на ваш вопрос, я использовал длину (unique()), чтобы попытаться подсчитать значения однозначно в столбцах –

+0

. Я добавил объяснение. –

+1

Большое спасибо за ваш ответ –

1

После преобразования ваших пустых строк в ВПЛ:

library(dplyr) 
mutate(df, SMS.Type.count = sum(!is.na(SMS.Type)), 
      Reply.Date.count = sum(!is.na(Reply.Date))) 
+1

OP хочет подсчитать уникальные записи. –

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