2014-11-23 6 views
0

Я строю сводную таблицу для репликации, и у меня возникают проблемы с ее выполнением с помощью ddply.Сортировка по годам подсчитывает фиктивные переменные для каждого округа (ddply)

Мне нужно отсортировать по году, а затем подсчитать, сколько уездов (fips), которые имеют фиктивную переменную == 1 (RVPI == 1) на каждый год.

Вот небольшая часть моих данных: https://www.dropbox.com/s/saem1xasai9t1zv/data2.csv?dl=0

И вот код, который я до сих пор:

Обратите внимание на RVPI только подсчет всех наблюдений в этом году и без учета округов.

Спасибо за любую помощь, которую вы можете предоставить.

data <- read.csv("/.../data2.csv") 

ddply(data, .(year), summarize, 
     Observations = length(year), 
     Total_Monitors = length(unique(indivID)), 
     Urban = round(length(urban == 1)/length(unique(fips))), 
     Counties = length(unique(fips)), 
     RVPI_Counties = sum(RVPI == 1)) #Reports total and doesn't account for counties(fips) 

Токовый выход:

year Observations Total_Monitors Urban Counties RVPI_Counties 
1 1989   147    2 74  2 147 
2 1990   209    4 52  4 209 
3 1991   554    7 79  7 554 
4 1992   389    5 78  5 0 
5 1993   422    5 84  5 0 
6 1994   397    5 79  5 0 
7 1995   453    5 91  5 0 
8 1996   453    5 91  5 0 
9 1997   391    5 78  5 0 
10 1998   454    5 91  5 0 
11 1999   451    5 90  5 0 
12 2000   444    5 89  5 0 
13 2001   449    5 90  5 0 
14 2002   458    5 92  5 0 
15 2003   454    5 91  5 0 
+0

@akrun: Я хочу, чтобы общее число стран, которые имеют RVPI == 1 за каждый год. Я понимаю, что моя начальная таблица была немного запутанной, поэтому я модифицировал ddply. – Vedda

+0

Вот и все. Спасибо @akrun – Vedda

ответ

1

Я хотел бы также использовать dplyr для больших наборов данных (по аналогии с @ jlhoward Ответим)

data <- read.csv('data2.csv') 
library(dplyr) 
data %>% 
     group_by(year) %>% 
     summarise(Observations=n(), 
      Total_Monitors=n_distinct(indivID),#n_distinct contributed by @beginneR 
      Urban=round(length(urban==1)/n_distinct(fips)), 
      Counties=n_distinct(fips), 
      RVPI_Counties=length(unique(fips[RVPI==1]))) 


# year Observations Total_Monitors Urban Counties RVPI_Counties 
#1 1989   147    2 74  2    2 
#2 1990   209    4 52  4    4 
#3 1991   554    7 79  7    7 
#4 1992   389    5 78  5    0 
#5 1993   422    5 84  5    0 
#6 1994   397    5 79  5    0 
#7 1995   453    5 91  5    0 
#8 1996   453    5 91  5    0 
#9 1997   391    5 78  5    0 
#10 1998   454    5 91  5    0 
#11 1999   451    5 90  5    0 
#12 2000   444    5 89  5    0 
#13 2001   449    5 90  5    0 
#14 2002   458    5 92  5    0 
#15 2003   454    5 91  5    0 
+0

Спасибо. Это то, что я искал. Почему вы предлагаете использовать dplyr для больших наборов данных? Потому что это быстрее? – Vedda

+0

@Amstell Да, это было бы быстрее по сравнению с 'ddply', но не так быстро, как' data.table' для очень больших наборов данных. – akrun

+0

@beginneR Спасибо, я его заменит. – akrun

2

Если вы не преданы ddply, вот data.table решение.

data <- read.csv("data2.csv") 
library(data.table) 
setDT(data)[,list(Observations=.N, 
       Total_Monitors=length(unique(indivID)), 
       Urban   =round(sum(urban==1)/length(unique(fips))), 
       Counties  =length(unique(fips)), 
       RVPI_Counties =length(unique(fips[RVPI==1]))), 
      by=year] 
#  year Observations Total_Monitors Urban Counties RVPI_Counties 
# 1: 1991   554    7 25  7    7 
# 2: 1992   389    5 17  5    0 
# 3: 1993   422    5 18  5    0 
# 4: 1994   397    5 18  5    0 
# 5: 1995   453    5 18  5    0 
# 6: 1996   453    5 18  5    0 
# 7: 1997   391    5 18  5    0 
# 8: 1998   454    5 18  5    0 
# 9: 1999   451    5 17  5    0 
# 10: 2000   444    5 18  5    0 
# 11: 2001   449    5 18  5    0 
# 12: 2002   458    5 18  5    0 
# 13: 2003   454    5 18  5    0 
# 14: 1990   209    4 23  4    4 
# 15: 1989   147    2 46  2    2 
+0

Спасибо. Мне нужно, чтобы это было с ddply, но я попробую это позже. СПАСИБО! – Vedda