2017-12-06 16 views
2

캘리포니아의 공립학교 개학 및 개강 날짜가있는 데이터가 있습니다. 질문 하단에 here 또는 dput()을 사용할 수 있습니다. 데이터에는 또한 학교 유형 및 학교 위치가 나열되어 있습니다. 학교 유형뿐만 아니라 학교 폐쇄도 고려한 누적 합계 열을 작성하려고합니다.누적 합계 (누계 포함)

# open charter schools 
pubschls$open_chart <- ifelse(pubschls$Charter=="Y" & is.na(pubschls$ClosedDate)==TRUE, 1, 0) 
# open public schools 
pubschls$open_pub <- ifelse(pubschls$Charter=="N" & is.na(pubschls$ClosedDate)==TRUE, 1, 0) 
# closed charters 
pubschls$closed_chart <- ifelse(pubschls$Charter=="Y" & is.na(pubschls$ClosedDate)==FALSE, 1, 0) 
# closed public schools 
pubschls$closed_pub <- ifelse(pubschls$Charter=="N" & is.na(pubschls$ClosedDate)==FALSE, 1, 0) 
lausd <- filter(pubschls, NCESDist=="0622710") 
# count number open during each year 

그럼 난에 서로 열을 빼기 : 여기

은 기본적으로 나를 ifelse 사용 조건에 따라 다른 1과 0의 많은 인코딩 수반 내가 가지고 올 한 솔루션입니다 합계를 얻으십시오.

la_schools_count <- aggregate(lausd[c('open_chart','closed_chart','open_pub','closed_pub')], 
by=list(year(lausd$OpenDate)), sum) 

    # find net charters by subtracting closed from open 
    la_schools_count$net_chart <- la_schools_count$open_chart - la_schools_count$closed_chart 
    # find net public schools by subtracting closed from open 
    la_schools_count$net_pub <- la_schools_count$open_pub - la_schools_count$closed_pub 
    # add running totals 
    la_schools_count$cum_chart <- cumsum(la_schools_count$net_chart) 
    la_schools_count$cum_pub <- cumsum(la_schools_count$net_pub) 
    # total totals 
    la_schools_count$total <- la_schools_count$cum_chart + la_schools_count$cum_pub 

내 출력은 다음과 같습니다이 더 나은 방법으로 수행 할 수 있다면 난 그냥 궁금 해서요

la_schools_count <- select(la_schools_count, "year", "cum_chart", "cum_pub", "pen_rate", "total") 
    year cum_chart cum_pub pen_rate total 
1 1952   1  0 100.00000  1 
2 1956   1  1 50.00000  2 
3 1969   1  2 33.33333  3 
4 1980  55  469 10.49618 524 
5 1989  55  470 10.47619 525 
6 1990  55  470 10.47619 525 
7 1991  55  473 10.41667 528 
8 1992  55  476 10.35782 531 
9 1993  55  477 10.33835 532 
10 1994  56  478 10.48689 534 
11 1995  57  478 10.65421 535 
12 1996  57  479 10.63433 536 
13 1997  58  481 10.76067 539 
14 1998  59  480 10.94620 539 
15 1999  61  480 11.27542 541 
16 2000  61  481 11.25461 542 
17 2001  62  482 11.39706 544 
18 2002  64  484 11.67883 548 
19 2003  73  485 13.08244 558 
20 2004  83  496 14.33506 579 
21 2005  90  524 14.65798 614 
22 2006  96  532 15.28662 628 
23 2007  90  534 14.42308 624 
24 2008  97  539 15.25157 636 
25 2009  108  546 16.51376 654 
26 2010  124  566 17.97101 690 
27 2011  140  580 19.44444 720 
28 2012  144  605 19.22563 749 
29 2013  162  609 21.01167 771 
30 2014  179  611 22.65823 790 
31 2015  195  611 24.19355 806 
32 2016  203  614 24.84700 817 
33 2017  211  619 25.42169 830 

. 조건에 따라 모든 행에 apply 문을 사용 하시겠습니까?

dput: 
structure(list(CDSCode = c("19647330100289", "19647330100297", 
"19647330100669", "19647330100677", "19647330100743", "19647330100750" 
), OpenDate = structure(c(12324, 12297, 12240, 12299, 12634, 
12310), class = "Date"), ClosedDate = structure(c(NA, 15176, 
NA, NA, NA, NA), class = "Date"), Charter = c("Y", "Y", "Y", 
"Y", "Y", "Y")), .Names = c("CDSCode", "OpenDate", "ClosedDate", 
"Charter"), row.names = c(NA, -6L), class = c("tbl_df", "tbl", 
"data.frame")) 
+0

'pen_rate'이란 무엇입니까? 너 아직 설명하지 않았어. – jazzurro

+0

예. pen_rate는 매우 중요하지 않습니다. 보급률입니다. 기본적으로 나는 헌장의 수를 취하여 합계로 나누었다. 유용하다고 보이지만 비율을 표시하는 더 좋은 방법이있을 것이라고 확신합니다. – Francisco

답변

0

나는 코드를 읽고 pen_rate을 제외한 모든 것을 학습했습니다. pen_ratecum_charttotal으로 나누어 계산 한 것으로 보입니다. 원본 데이터 세트를 다운로드하고 다음 작업을 수행했습니다. 나는 데이터 세트 foo을 불렀다. 닫힌 시간), 나는 CharterClosedDate을 합쳤다. ClosedDate가 NA인지 아닌지 확인한 다음 논리적 출력을 숫자 (1 = 열림, 0 = 닫음)로 변환했습니다. 이것이 네 개의 그룹 (즉, open_chart, closed_chart, open_pub 및 closed_pub)을 생성 한 방법입니다. 나는 이것이 당신에게 적은 타이핑을 요구할 것이라고 생각합니다. 날짜가 성격이기 때문에 나는 substr()을 사용하여 연도를 추출했습니다. 날짜 개체가 있으면 다른 작업을 수행해야합니다. 1 년이되면 데이터를 그룹화하고 count()을 사용하여 각 학교 유형별로 몇 개의 학교가 존재하는지 계산합니다. 이 부분은 aggregate() 코드와 동일합니다. 그런 다음 spread()을 사용하여 출력을 와이드 형식 데이터로 변환하고 코드에서 설명한대로 나머지 계산을 수행합니다. 최종 결과물은 귀하의 질문과 다른 것으로 보이지만 결과는 귀하의 코드를 실행하여 얻은 결과와 동일합니다. 이게 당신을 도울 수 있기를 바랍니다.

library(dplyr) 
library(tidyr) 
library(readxl) 

# Get the necessary data 
foo <- read_xls("pubschls.xls") %>% 
     select(NCESDist, CDSCode, OpenDate, ClosedDate, Charter) %>% 
     filter(NCESDist == "0622710" & (!Charter %in% NA)) 


mutate(foo, group = paste(Charter, as.numeric(is.na(ClosedDate)), sep = "_"), 
     year = substr(OpenDate, star = nchar(OpenDate) - 3, stop = nchar(OpenDate))) %>% 
count(year, group) %>% 
spread(key = group, value = n, fill = 0) %>% 
mutate(net_chart = Y_1 - Y_0, 
     net_pub = N_1 - N_0, 
     cum_chart = cumsum(net_chart), 
     cum_pub = cumsum(net_pub), 
     total = cum_chart + cum_pub, 
     pen_rate = cum_chart/total) 

# A part of the outcome 
# year N_0 N_1 Y_0 Y_1 net_chart net_pub cum_chart cum_pub total pen_rate 
#1 1866 0 1 0 0   0  1   0  1  1 0.00000000 
#2 1873 0 1 0 0   0  1   0  2  2 0.00000000 
#3 1878 0 1 0 0   0  1   0  3  3 0.00000000 
#4 1881 0 1 0 0   0  1   0  4  4 0.00000000 
#5 1882 0 2 0 0   0  2   0  6  6 0.00000000 
#110 2007 0 2 15 9  -6  2  87  393 480 0.18125000 
#111 2008 2 8 9 15   6  6  93  399 492 0.18902439 
#112 2009 1 9 4 15  11  8  104  407 511 0.20352250 
#113 2010 5 26 5 21  16  21  120  428 548 0.21897810 
#114 2011 2 16 2 18  16  14  136  442 578 0.23529412 
#115 2012 2 27 3 7   4  25  140  467 607 0.23064250 
#116 2013 1 5 1 19  18  4  158  471 629 0.25119237 
#117 2014 1 3 1 18  17  2  175  473 648 0.27006173 
#118 2015 0 0 2 18  16  0  191  473 664 0.28765060 
#119 2016 0 3 0 8   8  3  199  476 675 0.29481481 
#120 2017 0 5 0 9   9  5  208  481 689 0.30188679 
+0

고마워요! 이것은 훨씬 간결합니다. – Francisco

+0

@Francisco 도움을 주셔서 감사합니다. :) – jazzurro