保留/删除符合特定条件的数据行

时间:2013-02-26 22:06:40

标签: r

我收集了一项州考试的数据,该考试每年两次对几所学校的学生进行评分。有些学校派学生参加今年第一学期的考试,而其他学校则在第二学期发送考试。

我有每所学校的分数总和,但我需要消除过去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年它没有派任何学生参加州考试。但是应该保留1号学校,因为尽管它在2005年没有派遣任何学生,但它确实从2006年到2012年至少向学生发送过一次。

这就是我想要实现的目标,但仍然没有运气。

2 个答案:

答案 0 :(得分:1)

怎么样:

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

答案 1 :(得分: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), ]