2016-04-25 3 views
0

У меня есть набор данных о преступлениях, в котором есть несколько переменных (ID, Год, Дата, Арест), теперь я пытаюсь получить долю Арестований, сделанных в конкретном году, например, в течение многих лет (2001,2010,2015), как можно Я вычисляю его с помощью функции таблицы?Как получить пропорции в R, используя функцию таблицы?

Я попытался с помощью ниже код, но он не дает достойный результат:

prop.table(table(CRDATA$Year,CRDATA$Arrest)) 

и

prop.test(table(CRDATA$Year,CRDATA$Arrest)) 

Примечание: Имя набора данных CRDATA, год имеет тип Дата и арест из типа данных Logi

Ниже приведена часть набора данных

ID  Date   Location Arrest Area Year 
8951354 12/31/12 23:15 STREET FALSE 69 2012 
8951141 12/31/12 22:00 STREET FALSE 24 2012 
8952745 12/31/12 22:00 YARD FALSE 11 2012 
8952223 12/31/12 22:00 STREET FALSE 67 2012 
8951608 12/31/12 21:30 STREET FALSE 35 2012 
8950793 12/31/12 20:30 STREET TRUE 19 2012 
8950760 12/31/12 20:10 STREET FALSE 48 2012 
8951611 12/31/12 20:00 STREET FALSE 40 2012 
8951802 12/31/12 19:00 STREET TRUE 29 2012 
+3

пожалуйста, поделитесь небольшой пример набора данных, который сделает ваш код воспроизводимый, наряду с ожидаемым выходом. – mtoto

+0

Привет @mtoto, извините за предоставление неполных данных, я бы хотел, чтобы я мог объяснить себя лучше, чем это. Я новичок в R и изо всех сил стараюсь догнать все как можно скорее! – Soumyaansh

+1

Нет проблем, вы можете показать ожидаемый результат, пожалуйста? – mtoto

ответ

3

Вы должны указать, что вы хотите (всего, строки, столбцы):

set.seed(123) 
dat=data.frame(Year=rep(2001:2010,10),Var=rnorm(100,200,50)>198) 
prop.table(table(dat$Year,dat$Var)) #% of total 

     FALSE TRUE 
    2001 0.04 0.06 
    2002 0.06 0.04 
    2003 0.05 0.05 
    2004 0.04 0.06 
    2005 0.06 0.04 
    2006 0.03 0.07 
    2007 0.03 0.07 
    2008 0.05 0.05 
    2009 0.05 0.05 
    2010 0.06 0.04 
prop.table(table(dat$Year,dat$Var),1) #% rows 

     FALSE TRUE 
    2001 0.4 0.6 
    2002 0.6 0.4 
    2003 0.5 0.5 
    2004 0.4 0.6 
    2005 0.6 0.4 
    2006 0.3 0.7 
    2007 0.3 0.7 
    2008 0.5 0.5 
    2009 0.5 0.5 
    2010 0.6 0.4 
prop.table(table(dat$Year,dat$Var),2) #% columns 

      FALSE  TRUE 
    2001 0.08510638 0.11320755 
    2002 0.12765957 0.07547170 
    2003 0.10638298 0.09433962 
    2004 0.08510638 0.11320755 
    2005 0.12765957 0.07547170 
    2006 0.06382979 0.13207547 
    2007 0.06382979 0.13207547 
    2008 0.10638298 0.09433962 
    2009 0.10638298 0.09433962 
    2010 0.12765957 0.07547170 
+0

Привет @Robert, я ценю ваш быстрый ответ, назовите меня наивным или глупым, что нет ... но я думаю, что мне нужно знать много вещей в R, поскольку я не могу понять ваш ответ. Позвольте мне сформулировать мой вопрос (по сути), я хочу знать долю арестов, сделанных в 2010 году, как я могу получить ее по функции таблицы? – Soumyaansh

+0

Затем используйте prop по строкам, в примере ответ будет 40% 'prop.table (table (dat $ Year, dat $ Var), 1)' – Robert

0

индексация является ключевым. Вы можете перечислить две переменные в соответствии с критериями, которые вам нужны. Рассмотрим эти данные:

dt <- data.frame(gender = rep(c("Male", "Female"), c(4, 2)), trans = rep(c("Car", "Bus", "Bike"), c(3, 2, 1))) 

table(dt) 
     trans 
gender Bike Bus Car 
Female 1 1 0 
Male  0 1 3 

Регулируя аргументы dt$colname, вы можете получить более точный контроль над конечным выходом. Я думаю, что это тот момент, который требует внимания. Здесь я хочу только тех, кто пользуется автомобилем.

table(dt$gender[dt$trans=="Car"]) 

Female Male 
    0  3 

Для вашего случая, следовательно, попробуйте обработать проблему с индексированием. Вместо

prop.test(table(CRDATA$Year,CRDATA$Arrest)), 

попробовать

prop.test(table(CRDATA$Year[CRDATA$Arrest == "FALSE"])) 
+0

Я работаю над этим :) – Worice

0

Кстати вы структурированные ваши данные, то мне кажется, что вы не получите реальный годовой процент , пока вы не обобщать на году. Если вы идете prop.table(table, то все, что вы найдете, это то, что каждая запись представляет для всего всего (либо итогом, либо строкой, либо столбцом, как в ответе Роберта).

Для summaryze по годам:

library(data.table) 
setDT(CRDATA) 
CRDATA[, sum(Arrest), by = Year][, .(Year, prop.table(V1))] 

Первое выражение в [] Объединяет по годам, второй вычисляет пропорции и отображает его вдоль года.

########## EDIT ########

dplyr альтернатива:

library(dplyr) 
CRDATA %>% group_by(YEAR) %>% summarize(arr = sum(Arrest)) %>% mutate(prop=arr/sum(arr))