【问题标题】:The dplyr filter doesn't seem to work in for loopdplyr 过滤器似乎不适用于 for 循环
【发布时间】:2019-07-13 11:50:32
【问题描述】:

我有很多列,我想删除 3 个特定值。我想在 for 循环中做到这一点。但由于某种原因,它不起作用,我不知道为什么。这是函数:

for (i in colnames(df1)){
    z <- as.name(i)
    df1 <- df1 %>% filter(z != "Refusal") %>% filter(z != "Don't know") %>%  filter(z != "No answer")
}

我知道变量 z 不是必需的,但我希望它可能会有所帮助。它没有。

这里是每个列的完整示例代码。这可行,但相当烦人的解决方案

df1 <- data.frame(country = df$cntry, gender = df$gndr, pplfair = df$pplfair,
                  gincdif = df$gincdif, happy = df$happy, sclmeet = df$sclmeet,
                  inprdsc = df$inprdsc, sclat = df$sclact, rlgbg = df$rlgblg, 
                  dfincac = df$dfincac, sblazy = df$sblazy, eduyrs = df$eduyrs,
                  imprich = df$imprich, iprspot = df$iprspot, impfun = df$impfun)

##Wrangling data

###from data removing no answer, don't know, refusal
df1 <- df1 %>% filter(pplfair != "Refusal") %>% filter(pplfair != "Don't know") %>%  filter(pplfair != "No answer")

df1 <- df1 %>% filter(gincdif != "Refusal") %>% filter(gincdif != "Don't know") %>%  filter(gincdif != "No answer")

df1 <- df1 %>% filter(happy != "Refusal") %>% filter(happy != "Don't know") %>%  filter(happy != "No answer")

df1 <- df1 %>% filter(sclmeet != "Refusal") %>% filter(sclmeet != "Don't know") %>%  filter(sclmeet != "No answer")

df1 <- df1 %>% filter(inprdsc != "Refusal") %>% filter(inprdsc != "Don't know") %>%  filter(inprdsc != "No answer")

df1 <- df1 %>% filter(sclat != "Refusal") %>% filter(sclat != "Don't know") %>%  filter(sclat != "No answer")

df1 <- df1 %>% filter(rlgbg != "Refusal") %>% filter(rlgbg != "Don't know") %>%  filter(rlgbg != "No answer")

df1 <- df1 %>% filter(dfincac != "Refusal") %>% filter(dfincac != "Don't know") %>%  filter(dfincac != "No answer")

df1 <- df1 %>% filter(sblazy != "Refusal") %>% filter(sblazy != "Don't know") %>%  filter(sblazy != "No answer")

df1 <- df1 %>% filter(eduyrs != "Refusal") %>% filter(eduyrs != "Don't know") %>%  filter(eduyrs != "No answer")

df1 <- df1 %>% filter(imprich != "Refusal") %>% filter(imprich != "Don't know") %>%  filter(imprich != "No answer")

df1 <- df1 %>% filter(iprspot != "Refusal") %>% filter(iprspot != "Don't know") %>%  filter(iprspot != "No answer")

df1 <- df1 %>% filter(impfun != "Refusal") %>% filter(impfun != "Don't know") %>%  filter(impfun != "No answer")

如果有任何建议,我将不胜感激。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。您需要将名称拼接到过滤器中。使用filter(!!z != "Don't know"),例如在过滤器中尝试使用z

标签: r for-loop filter dplyr


【解决方案1】:

使用filter_all%in%可以大大简化OP的代码:

library(dplyr)

df1 %>% 
  filter_all(any_vars(!(. %in% c("Refusal", "Don't know", "No answer"))))

如果它是所有列的子集,则使用 filter_at

df1 %>% 
  filter_at(vars(varnames), any_vars(!(. %in% c("Refusal", "Don't know", "No answer"))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 2019-07-28
    • 1970-01-01
    • 2018-05-29
    • 2021-09-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多