如果给定年份的所有观测值均为NA,如何删除面板数据中的变量?

问题描述

我有一个这样的数据框,

scores <-structure(list(student = structure(c(1L,1L,2L,3L,3L),.Label = c("adam","mike","rose"),class = "factor"),year = c(2001L,2002L,2003L,2001L,2003L),math = c(5L,5L,4L,NA
    ),english = c(2L,NA,4L),history = c(NA,geography = c(4L,3L)),class = "data.frame",row.names = c(NA,-9L))

我想删除给定年份没有学生得分的变量。例如,没有学生在2002年获得英语成绩,因此,如果我的相关年份是2002年,我想删除变量“英语”。同样,没有学生在2001年获得历史成绩。因此,如果我的相关年份是2001年,变量“历史”应删除。如果我的相关年份是2003,则不会删除任何变量,因为至少一个学生(更准确地说是Mike和Adam)在变量“数学”中得分。

为此,我构建了以下功能来完成工作

byearNA<-function(x,z = 3,ano = 2001) {
    matri <- data.frame(matrix(,nrow=nrow(x),ncol=(z-1)))
    matri <- x[c(1:(z-1))]
    for (i in z:ncol(x)){
        if (all(is.na(x[x[2] == ano,i]))==FALSE) {
            matri <- cbind(matri,x[i])
        }
    }
    return(matri)
}

但是,我真的相信可以使用R中的本机函数(已经存在的函数)完成此操作。我已经尝试了很长时间,但是找不到方法,所以才创建了自己的函数

如何使用R中的本机函数来完成此任务?

非常感谢您

解决方法

我不确定100%是否在寻找什么,但是您尝试过吗?

scores2 <- na.omit(scores)

这将返回有完整案例(无NA值)的2行

在latemail注释后添加一些行...以长格式存储是一个好主意。如果您不想在表格中看到NA值,就需要使用较长的数据框 这是dplyr方法

scores_gathered <- gather(scores,"class","count",3:6) 

scores_gathered <-scores_gathered %>%
  group_by(year,class) %>%
  summarize(sum = sum(count))

complete_list <- scores_gathered %>%
  drop_na(sum) %>%
  select(year,class) %>%
  mutate(has_students = "yes")