正在删除数据中包含所有NA的组。表或R中的DPLYR

正在删除数据中包含所有NA的组。表或R中的DPLYR,r,data.table,R,Data.table,我有一个很高的数据框,在这个数据框中,我想删除包含所有“分数”或所有“时间”的NA的学生ID。这只是如果它都是NA,如果有一些NA,那么我想保留它们的所有记录…这里是一个基本的R解决方案,使用子集+ave dataHAVE = data.frame("student"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5), "time"=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3), "score"=c(7,9,5,NA,NA,NA,NA,3,9,NA,N

我有一个很高的数据框,在这个数据框中,我想删除包含所有“分数”或所有“时间”的NA的学生ID。这只是如果它都是NA,如果有一些NA,那么我想保留它们的所有记录…

这里是一个基本的R解决方案,使用
子集
+
ave

dataHAVE = data.frame("student"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
"time"=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3),
"score"=c(7,9,5,NA,NA,NA,NA,3,9,NA,NA,NA,7,NA,5))



dataWANT=data.frame("student"=c(1,1,1,3,3,3,5,5,5),
"time"=c(1,2,3,1,2,3,NA,2,3),
"score"=c(7,9,5,NA,3,9,7,NA,5))

dataWANT这里是一个使用
subset
+
ave

dataHAVE = data.frame("student"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
"time"=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3),
"score"=c(7,9,5,NA,NA,NA,NA,3,9,NA,NA,NA,7,NA,5))



dataWANT=data.frame("student"=c(1,1,1,3,3,3,5,5,5),
"time"=c(1,2,3,1,2,3,NA,2,3),
"score"=c(7,9,5,NA,3,9,7,NA,5))
dataWANT这就是你想要的吗

dataWANT <- subset(dataHAVE,
                   !Reduce(`|`,Map(function(x) ave(get(x),student,FUN = function(v) all(is.na(v))), c("time","score"))))
库(dplyr)
数据拥有%>%
分组依据(学生)%>%
过滤器(!all(is.na(分数)))
学生时间分数
1       1     1     7
2       1     2     9
3       1     3     5
4 3 1 NA
5       3     2     3
6       3     3     9
7 5 NA 7
8 5 2 NA
9       5     3     5
每个
学生
只有在没有(
)的情况下才会保留
所有
分数
值都是
NA
这是您想要的吗

dataWANT <- subset(dataHAVE,
                   !Reduce(`|`,Map(function(x) ave(get(x),student,FUN = function(v) all(is.na(v))), c("time","score"))))
库(dplyr)
数据拥有%>%
分组依据(学生)%>%
过滤器(!all(is.na(分数)))
学生时间分数
1       1     1     7
2       1     2     9
3       1     3     5
4 3 1 NA
5       3     2     3
6       3     3     9
7 5 NA 7
8 5 2 NA
9       5     3     5

每个
学生
仅在不(
)的情况下保留
所有
分数
值均为
NA
创建一个虚拟变量,并基于该变量进行筛选

库(“dplyr”)
dataHAVE=data.frame(“学生”=c(1,1,1,2,2,3,3,4,4,5,5),
“时间”=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3),
“得分”=c(7,9,5,不适用,不适用,不适用,不适用,3,9,不适用,不适用,不适用,7,不适用,5))
数据拥有%>%
变异(检查=is.na(时间)和is.na(分数))%>%
过滤器(检查==假)%>%
选择(-check)
#>学生时间分数
#> 1        1    1     7
#> 2        1    2     9
#> 3        1    3     5
#>4 2 1 NA
#>5 2 NA
#>6 2 3 NA
#>7 3 1 NA
#> 8        3    2     3
#> 9        3    3     9
#>10 5 NA 7
#>11 5 2 NA
#> 12       5    3     5

由(v0.3.0)于2020-02-21创建创建创建一个虚拟变量,并基于该虚拟变量进行筛选

库(“dplyr”)
dataHAVE=data.frame(“学生”=c(1,1,1,2,2,3,3,4,4,5,5),
“时间”=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3),
“得分”=c(7,9,5,不适用,不适用,不适用,不适用,3,9,不适用,不适用,不适用,7,不适用,5))
数据拥有%>%
变异(检查=is.na(时间)和is.na(分数))%>%
过滤器(检查==假)%>%
选择(-check)
#>学生时间分数
#> 1        1    1     7
#> 2        1    2     9
#> 3        1    3     5
#>4 2 1 NA
#>5 2 NA
#>6 2 3 NA
#>7 3 1 NA
#> 8        3    2     3
#> 9        3    3     9
#>10 5 NA 7
#>11 5 2 NA
#> 12       5    3     5

由(v0.3.0)于2020年2月21日创建,因为没有人建议创建,这里有一个使用
数据的解决方案。表

library(dplyr)

dataHAVE %>%
    group_by(student) %>%
    filter(!all(is.na(score)))

  student  time score
    <dbl> <dbl> <dbl>
1       1     1     7
2       1     2     9
3       1     3     5
4       3     1    NA
5       3     2     3
6       3     3     9
7       5    NA     7
8       5     2    NA
9       5     3     5
编辑: 以前的但错误的代码:

  library(data.table)
  dataHAVE = data.table("student"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
                        "time"=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3),
                        "score"=c(7,9,5,NA,NA,NA,NA,3,9,NA,NA,NA,7,NA,5))
新的和正确的代码:

dataHAVE[, .SD[!(all(is.na(time)) & all(is.na(score)))], by = student]
返回:

dataHAVE[, .SD[!(all(is.na(time)) | all(is.na(score)))], by = student]
编辑:
更新
data.table
带有@Cole建议的解决方案…

由于没有人提出建议,这里有一个使用
数据的解决方案。table

library(dplyr)

dataHAVE %>%
    group_by(student) %>%
    filter(!all(is.na(score)))

  student  time score
    <dbl> <dbl> <dbl>
1       1     1     7
2       1     2     9
3       1     3     5
4       3     1    NA
5       3     2     3
6       3     3     9
7       5    NA     7
8       5     2    NA
9       5     3     5
编辑: 以前的但错误的代码:

  library(data.table)
  dataHAVE = data.table("student"=c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5),
                        "time"=c(1,2,3,1,2,3,1,2,3,NA,NA,NA,NA,2,3),
                        "score"=c(7,9,5,NA,NA,NA,NA,3,9,NA,NA,NA,7,NA,5))
新的和正确的代码:

dataHAVE[, .SD[!(all(is.na(time)) & all(is.na(score)))], by = student]
返回:

dataHAVE[, .SD[!(all(is.na(time)) | all(is.na(score)))], by = student]
编辑:
更新
data.table
带有@Cole建议的解决方案…

data.table
解决方案概括为任意数量的列:

   student time score
1:       1    1     7
2:       1    2     9
3:       1    3     5
4:       3    1    NA
5:       3    2     3
6:       3    3     9
7:       5   NA     7
8:       5    2    NA
9:       5    3     5

data.table
解决方案概括为任意数量的列:

   student time score
1:       1    1     7
2:       1    2     9
3:       1    3     5
4:       3    1    NA
5:       3    2     3
6:       3    3     9
7:       5   NA     7
8:       5    2    NA
9:       5    3     5
另一种选择:

dataHAVE[, 
         .SD[do.call("+", lapply(.SD, function(x) any(!is.na(x)))) == ncol(.SD)], 
         by = student]

#    student time score
# 1:       1    1     7
# 2:       1    2     9
# 3:       1    3     5
# 4:       3    1    NA
# 5:       3    2     3
# 6:       3    3     9
# 7:       5   NA     7
# 8:       5    2    NA
# 9:       5    3     5
另一种选择:

dataHAVE[, 
         .SD[do.call("+", lapply(.SD, function(x) any(!is.na(x)))) == ncol(.SD)], 
         by = student]

#    student time score
# 1:       1    1     7
# 2:       1    2     9
# 3:       1    3     5
# 4:       3    1    NA
# 5:       3    2     3
# 6:       3    3     9
# 7:       5   NA     7
# 8:       5    2    NA
# 9:       5    3     5

这将忽略时间约束这将忽略时间约束。您是在寻找
data.table
解决方案还是为什么要使用该标记?@dario我对data.table和dplyr感兴趣,因为我正在学习data.table,比较使用这两个包的解决方案很有帮助。非常感谢!这回答了你的问题吗?嗨,博维。您是在寻找
data.table
解决方案还是为什么要使用该标记?@dario我对data.table和dplyr感兴趣,因为我正在学习data.table,比较使用这两个包的解决方案很有帮助。非常感谢!这回答了你的问题吗?这是一个有点重复的问题,但这里有一个体面的方式:
dataHAVE[,.SD[!(all(is.na(time))| all(is.na(score))],by=student]
另请参见:@Cole:感谢大家花时间查找(并找到!)一个优秀的解决方案@这是行不通的。学生2应该被删除,因为他们所有的分数都是NA@bvowe:你当然是对的。如果已修复错误的
&
,并将其替换为正确的
|
。。。抱歉,这是一个有点重复的问题,但这里有一个体面的方式:
dataHAVE[,.SD[!(all(is.na(time))| all(is.na(score))],by=student]
另请参阅:@Cole:感谢大家花时间查找(并找到!)一个优秀的解决方案@这是行不通的。学生2应该被删除,因为他们所有的分数都是NA@bvowe:你当然是对的。如果已修复错误的
&
,并将其替换为正确的
|
。。。对不起