2013-02-26 61 views
0

我收集了一年两次对几所学校的学生进行评分的州考的数据。一些学校派他们的学生在今年的第一学期参加考试,而另一些学校则在第二学期进行考试。保留/删除符合特定条件的数据行

我有每个学校的分数总和,但我需要消除过去6年未提交过测试的学校。

换句话说,我需要一个代码来消除在过去的6年中一整年没有出现在测试中的行(学校)(这两个学期都有NA值)。

我有超过20万的观察,我还没有能够成功地消除学校。

的数据帧被安排如下(例如)

School_Code  Score_2000.1  Score_2000.2  Score_2001.1  Score_2001.2  Score_2002.1  Score_2002.2  Score_2003.1  Score_2004.2  Score_2005.1  Score_2005.2  Score_2006.1  Score_2006.2  Score_2007.1  Score_2007.2  Score_2008.1  Score_2008.2  Score_2009.1  Score_2009.2  Score_2010.1  Score_2010.2  Score_2011.1  Score_2011.2  Score_2012.1  Score_2012.2 
      1    NA    NA    243552    NA    234566    NA   726432    NA     NA    NA    457246    NA   741362    NA    243552    NA    234566    NA    764332    NA    234566    NA    76432    NA 
      2    NA    978304    NA    263760    NA    152853   NA    426483    NA    753651    NA    980412   NA    147258    NA    567123    NA    876543    NA    148234    NA    126745    NA    123456  
      3    NA    324654    NA    264660    NA    152753   NA    876521    NA    653211    NA    998232   NA    148766    NA    236421    NA    543921    NA    765134    NA    129805    NA    125600  
      4    NA    NA    425682    NA    645686    NA   328765    NA    861452    NA    276567    NA    NA     NA    529805    NA    NA    123876    327626    998232   NA    148766   726432    NA 
     .     .    .     .    .     .     .     .     .     .    .     .    .     .     .     .     .     .    .     .    .     .     .     .     . 
     .     .    .     .    .     .     .     .     .     .    .     .    .     .     .     .     .     .    .     .    .     .     .     .     . 
     .     .    .     .    .     .     .     .     .     .    .     .    .     .     .     .     .     .    .     .    .     .     .     .     . 
      n    876521    NA    425682    NA    645686    NA   328765    NA    861452    NA    276567    NA   142327    NA    529805    NA    643185    NA    327626 

在例如该特定情况下,校数4应当从样品消除,因为在2007年它没有发送任何学生参加状态测试。但是,尽管2005年没有发送任何学生,但是学校号码1应该保留,但它至少在2006年至2012年间发送过学生一次。

这就是我想要达到的,但仍然没有运气它。

回答

1

如何:

schools <- df(...) 
schools.ok <- schools[apply(schools[,seq(from = ncol(schools) - 11, to = ncol(schools))], 1, function(x) !(sum(is.na(x)) >= 7)),] 
+0

它仍然给所有4行。 – Arun 2013-02-26 22:22:30

+0

它现在给出一个空的data.frame。 – Arun 2013-02-26 22:24:52

+0

回到所有4行。 :) – Arun 2013-02-26 22:26:14

1

像这样的事情?

idx <- which(colSums(apply(df[,12:25], 1, 
      function(x) 
      apply(as.matrix(seq(1, 14, by=2)), 1, 
      function(y) all(is.na(x[y:(y+1)]))))) 
> 0) 

它给出了要删除的行索引。你可以只是做:

df[setdiff(1:nrow(df), idx), ] 

如果你不希望指数,而只是直接过滤的结果,那么,

df[!(colSums(apply(df[,12:25], 1, 
      function(x) 
      apply(as.matrix(seq(1, 14, by=2)), 1, 
      function(y) all(is.na(x[y:(y+1)]))))) 
> 0), ]