【问题标题】:Using a loop in filter在过滤器中使用循环
【发布时间】:2017-04-14 08:47:49
【问题描述】:

我对 R 很陌生。使用 dplyr 和过滤器,我想选择变量列表为 !=NA 的记录。

df %>% filter (var1 != "NA" | var2 != "NA" | var3 != "NA" )

问题是我有 85 个这样的变量(以 HR 结尾)。所以我把它们提取出来放在一个向量中。

hr_variables <- grep("HR$", names(ssc), value=TRUE)

我想创建一个循环,通过对每个元素应用 OR 条件来获取 hr_variable 和 filter()。 这在 R 中可能吗?

【问题讨论】:

  • 你有NA 作为字符还是使用is.na 请展示一个可重现的小例子和预期的输出。您的意思是所选行在所有 HR 变量中都没有 NA 还是逻辑不同?

标签: r loops dplyr


【解决方案1】:

我们可以使用base R 更轻松地做到这一点

ssc[!rowSums(is.na(ssc[hr_variables])),]
#  col1_HR col2_HR      col3
#2       1       3 0.5365853
#3       2       4 0.4196231

或使用tidyverse

library(tidyverse)
ssc %>% 
   select_(.dots = hr_variables) %>%
   map(~is.na(.)) %>% 
   reduce(`|`) %>%
    `!` %>% 
   extract(ssc, .,)

或者complete.cases

ssc %>% 
     select_(.dots = hr_variables) %>% 
     complete.cases(.) %>% 
     extract(ssc, ., )

数据

set.seed(24)
ssc <- data.frame(col1_HR = c(NA, 1, 2, 3), col2_HR = c(NA, 3, 4, NA), col3 = rnorm(4))

【讨论】:

  • 我对你的第一个建议略有改动,非常感谢:studies_hr &lt;- (rowSums(!is.na(ssc[,hr_variables])))&gt;0 ssc_hr &lt;- ssc [studies_hr, ]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 2021-07-06
  • 1970-01-01
  • 2021-10-16
  • 2022-11-02
  • 2019-07-14
  • 2016-08-17
相关资源
最近更新 更多