【问题标题】:Remove rows where multiple conditions are met over selected columns删除在选定列上满足多个条件的行
【发布时间】:2019-03-06 05:50:23
【问题描述】:

我有一个大约 1000 列的数据框。我对 14 个满意度评分变量感兴趣。

我需要删除 14 个评分变量中的任何一个包含“已跳过项目”或 NA 的行。

有没有一种方法可以删除我感兴趣的满意度评分变量向量中出现 NA 或“跳过项目”的所有行,目前在向量“cols”中。在下面的示例中,“cols”包含服务、效率和风味,但不包含经验和质量

cols = c("Service","Efficiency","Flavour")
dat<-data.frame(Number = 1:6, University = c("A","B","C","D","E","F"), 
                Service=c("Satisfied","Item skipped",NA, "Not satisfied", "Neither","Item skipped" ), 
                Efficiency =c("Neither", "Neither", "Item skipped","Satisfied", NA, NA),
                Flavour =c("Satisfied", NA, "Item skipped",
                                     "Neither", NA, NA), Quality =c("Not satisfied", "Neither", NA,"Satisfied", NA, NA),
                Experience =c("Satisfied", NA, NA,
                                     "Not satisfied", NA, NA),Age =rep(c(18:19), times =3))

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    在基础 R 中,我们可以使用 rowSums 删除 cols 中存在“跳过项目”或 NA 的行

    cols = c("Service", "Efficiency", "Flavour")
    
    dat[rowSums(dat[cols] == "Item skipped" | is.na(dat[cols])) == 0, ]
    
    #  Number University       Service Efficiency   Flavour       Quality    Experience Age
    #1      1          A     Satisfied    Neither Satisfied Not satisfied     Satisfied  18
    #4      4          D Not satisfied  Satisfied   Neither     Satisfied Not satisfied  19
    

    @amrrs 建议的使用apply 的替代方法

    dat[!apply(dat[cols], 1, function(x) any(x == 'Item skipped' | is.na(x))), ]
    

    【讨论】:

      【解决方案2】:

      编辑:: 使用我们可以使用的更新数据(这是假设 NA 总是与“Item_Skipped”一起出现,这似乎是这种情况):

       dat %>% 
      
           filter(!is.na(Experience))  
      
              Number University       Service Efficiency   Flavour       Quality    Experience Age
          1       1          A     Satisfied    Neither Satisfied Not satisfied     Satisfied  18
          2       4          D Not satisfied  Satisfied   Neither     Satisfied Not satisfied  19
      

      原文::

      我们可以使用(数据在下面的注释中):

      dat %>% 
        filter_at(vars(contains("rating")),all_vars(.!="Item Skipped"))
      

      或::

      dat %>% 
        filter_all(all_vars(.!="Item Skipped"))
      

      输出:

       Number University Service_rating Efficiency_rating Flavour_rating Age
      1      1          A      Satisfied           Neither      Satisfied  18
      2      4          D  Not satisfied         Satisfied        Neither  19
      

      注意

      dat<-data.frame(Number = 1:6, University = c("A","B","C","D","E","F"), 
                      Service_rating=c("Satisfied","Item skipped",NA, "Not satisfied", "Neither","Item skipped" ), 
                      Efficiency_rating =c("Neither", "Neither", "Item skipped","Satisfied", NA, NA),
                      Flavour_rating =c("Satisfied", NA, "Item skipped",
                                        "Neither", NA, NA), Age =rep(c(18:19), times =3))
      

      【讨论】:

      • 刚刚更改了这一点 - 评级列是任意名称。需要通过参考评级列名称'cols'的ot向量来做到这一点
      • 你能补充一下cols是什么吗?我无法绕过它。
      • 抱歉,上面的列是三个评级。进一步调整了data.frame。有很多评分栏,但我只是对其中一些感兴趣
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 1970-01-01
      • 2022-01-13
      • 2017-02-23
      • 2020-12-22
      • 2021-06-06
      • 2020-01-09
      相关资源
      最近更新 更多