正在删除数据中包含所有NA的组。表或R中的DPLYR
我有一个很高的数据框,在这个数据框中,我想删除包含所有“分数”或所有“时间”的NA的学生ID。这只是如果它都是NA,如果有一些NA,那么我想保留它们的所有记录…这里是一个基本的R解决方案,使用正在删除数据中包含所有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
子集+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:你当然是对的。如果已修复错误的&
,并将其替换为正确的|
。。。对不起