【问题标题】:R remove rows with most zero values (unique and removing all rows with 0 not working)R 删除具有最多零值的行(唯一并删除所有 0 的行不起作用)
【发布时间】:2019-09-14 04:51:13
【问题描述】:

您好,我遇到了一个奇怪的问题。

我有一个如下数据集:

City =c('XX','YY','XX','XX','YY')
Grade = c('A','B','A','A','B')
Variable1=c(.34,0,.34,0,0)
Variable2=c(.76,.3,0,.76,.3)
Variable3=c(.76,.3,0,.76,0)
Final_data = data.frame(City,Grade,Variable1,Variable2,Variable3)  
Final_data <- Final_data[order(City),]

排序后是这样的:

如您所见,第 1,2 行和第 3 行代表同一个城市 (XX),其成绩为 A。问题是在某些列有 0 的行中存在重复。理想情况下,我只会有城市 XX 的第 1 行和城市 YY 的第 1 行。 具体来说,在这种情况下,我想要的是,对于每个城市和年级,计算每行中零的数量,然后取零数量最少的行。

一种方法可能是:https://stackoverflow.com/a/47914087/3988575。但是,上面删除了所有为零的行。如果您查看带有 YY 城市和 B 级 的第 4 行和第 5 行,这两行都有一些带有 0 的列。类似地,

另一种方法是使用如下所示的独特功能:https://stackoverflow.com/a/31875208/3988575。在这种情况下,将选择满足条件的第一行。这对我也没有帮助。

预期的输出是这样的:

我怎么能做到这一点?任何帮助表示赞赏。

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    您可以使用dplyr,如下所示:

    library(dplyr)
    Final_data$CountZero <- apply(Final_data[, -(1:2)], 1, function(x) {
      sum(x == 0)
    })
    
    Final_data %>%
      group_by(City, Grade) %>%
      filter(CountZero == min(CountZero)) %>%
      select(-CountZero)
    # A tibble: 2 x 5
    # Groups:   City, Grade [2]
      City  Grade Variable1 Variable2 Variable3
      <fct> <fct>     <dbl>     <dbl>     <dbl>
    1 XX    A          0.34      0.76      0.76
    2 YY    B          0         0.3       0.3 
    

    【讨论】:

      猜你喜欢
      • 2014-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2015-03-26
      • 2020-10-04
      相关资源
      最近更新 更多