我收集了一项州考试的数据,该考试每年两次对几所学校的学生进行评分。有些学校派学生参加今年第一学期的考试,而其他学校则在第二学期发送考试。
我有每所学校的分数总和,但我需要消除过去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年至少向学生发送过一次。
这就是我想要实现的目标,但仍然没有运气。
答案 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), ]