2017-12-06 11 views
2

私は、カリフォルニア州の公立学校の閉鎖および開校日を持つデータセットを持っています。質問の末尾にhereまたはdput()があります。データには、学校の種類と場所も記載されています。私は学校のタイプと同様に学校の閉鎖も考慮に入れた累計の列を作成しようとしています。ここで実行中の合計(減算付き)

は基本的にifelseを使用した条件に基づいて、私は別の1のの多くをコードすると0伴い、私が作ってみた解決策は、次のとおりです。

# 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 

その後、私はお互いから列を引きます合計を得る。

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以外のことを学んだ。 はcum_chartで除算され、totalで割り算されているようです。私は元のデータセットをダウンロードして、以下を行った。私はデータセットfooを呼び出しました。閉鎖したとき)、私はCharterClosedDateを組み合わせた。私はClosedDateがNAかどうかをチェックし、論理出力を数値に変換しました(1 = open、0 = closed)。これは4つのグループ(つまり、open_chart、closed_chart、open_pub、およびclosed_pub)を作成した方法です。私はこれがあなたにタイピングを少なくするように頼むと思います。日付は文字であるので、substr()を使用して年を抽出しました。あなたが日付オブジェクトを持っているなら、あなたは何か他のことをする必要があります。年を取ったら、データをグループ化して、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

関連する問題