问题描述
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")