R语言 分别过滤多个色谱柱的NA

col17t5w  于 2023-04-18  发布在  其他
关注(0)|答案(1)|浏览(138)

我用ggplot制作纵向线形图,对于那些我只需要数据集来保持观察的对象,每个对象正好有两个时间点由于存在五个不同的“测试”,因此应当允许受试者对于测试1具有两个时间点NonNA,但是对于测试2具有两个NA。只要subjectID的对对于每个单独的测试都是相等的(因为每个图稍后单独绘制)。
为了过滤这个,我尝试了例如。

dat_all%>%
group_by(SubjectID) %>% 
filter(sum(!is.na(Test1 & Test2 & ...))==2)

dat_all%>%
group_by(SubjectID) %>% 
filter(!any(is.na(c(Test1, Test2, ...)))) %>%
filter(any(Time %in% "Post")) %>%
filter(any(Time %in% "Pre"))

dat_all%>%
group_by(SubjectID, Timepoint) %>% 
filter(!any(is.na(c(Test1, Test2, ...)))) %>%

每个受试者具有可变数量的时间点和NA。所有解决方案都省略所有na(例如,像完整的情况)或仅保留每个受试者的所有变量的non_NA对(有点像忽略了时间点参数:group_by(SubjectID,Timepoint))。
我能做什么?
P.S.:很抱歉没有提供一个可复制的例子,数据。不知道在哪里可以找到这样的数据集。

bq3bfh9z

bq3bfh9z1#

我们可以使用if_all-在按'SubjectID'分组后,循环if_all中的'Test'列,提取其中'Time'值分别为'Post'和'Pre'的每一列的值,使用!is.na检查非NA,使用sum获得逻辑向量上的非NA计数,检查'Pre',“Post”计数非NA相同(==),仅当所有Test列从早期比较中返回TRUE时,if_all才返回TRUE,因此filter仅对所有“Test”列具有相同配对非NA计数的那些组执行操作

library(dplyr)
dat_all%>%
group_by(SubjectID) %>%
filter(if_all(starts_with("Test"),  ~ 
              sum(!is.na(.x[Time %in% "Post"])) ==
              sum(!is.na(.x[Time %in% "Pre"])))) %>%
 ungroup

相关问题