2013-12-19 5 views
0

Я хотел бы суммировать следующие примеры данных в новый dataframe следующим образом:Как суммировать данные о дате по группам в R

Население, размер выборки (N), процент выполнения (%)

Sample Размер - это счет всех записей для каждой совокупности. Я могу сделать это с помощью команды table или tapply. Процент завершен процент записей с «End Дейта (все записи без„Дата окончания“предполагаются не завершена. Это где я теряюсь!

Примеры данных

sample <- structure(list(Population = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
    2L, 2L, 3L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 
    1L, 2L, 2L, 3L, 3L, 3L, 3L, 1L, 1L, 3L, 3L, 3L, 3L), .Label = c("Glommen", 
    "Kaseberga", "Steninge"), class = "factor"), Start_Date = structure(c(16032, 
    16032, 16032, 16032, 16032, 16036, 16036, 16036, 16037, 16038, 
    16038, 16039, 16039, 16039, 16039, 16039, 16039, 16041, 16041, 
    16041, 16041, 16041, 16041, 16044, 16044, 16045, 16045, 16045, 
    16045, 16048, 16048, 16048, 16048, 16048, 16048), class = "Date"), 
     End_Date = structure(c(NA, 16037, NA, NA, 16036, 16043, 16040, 
     16041, 16042, 16042, 16042, 16043, 16043, 16043, 16043, 16043, 
     16043, 16045, 16045, 16045, 16045, 16045, NA, 16048, 16048, 
     16049, 16049, NA, NA, 16052, 16052, 16052, 16052, 16052, 
     16052), class = "Date")), .Names = c("Population", "Start_Date", 
    "End_Date"), row.names = c(NA, 35L), class = "data.frame") 

ответ

2

Вы можете сделать это раскол/применить/скомбинировать:

spl = split(sample, sample$Population) 
new.rows = lapply(spl, function(x) data.frame(Population=x$Population[1], 
               SampleSize=nrow(x), 
               PctComplete=sum(!is.na(x$End_Date))/nrow(x))) 
combined = do.call(rbind, new.rows) 
combined 

#   Population SampleSize PctComplete 
# Glommen  Glommen   13 0.6923077 
# Kaseberga Kaseberga   7 1.0000000 
# Steninge Steninge   15 0.8666667 

Одно слово предостережения:. sample этого имя базовой функции, так что вы должны выбрать другое имя для фрейма данных

+0

Sorry об имени dataframe. Я старался держаться просто. Я ценю решение, используя базовые функции. У меня была более сложная проблема, и ваше решение помогло мне разобраться. –

2

Это легко с plyr пакета:

library(plyr) 
ddply(sample, .(Population), summarize, 
     Sample_Size = length(End_Date), 
     Percent_Completed = mean(!is.na(End_Date)) * 100) 

# Population Sample_Size Percent_Completed 
# 1 Glommen   13   69.23077 
# 2 Kaseberga   7   100.00000 
# 3 Steninge   15   86.66667 
+0

Это очень хорошее решение. Я голосовал только за решение split/apply/comb, поскольку мне нравится изучать R с базовыми пакетами. Спасибо! –

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