R删除值最多为零的行(唯一并删除所有值为0的行不起作用)

时间:2019-04-24 19:59:28

标签: r data-manipulation

嗨,我陷入了一个奇怪的问题。

我有一个类似以下的数据集:

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),]

排序后看起来像这样:

enter image description here

如您所见,第1,2和3行代表分配了A级的同一城市(XX)。问题是行重复,有些列的行为0。对于城市XX,我最好只有1行,对于城市YY,我只有1行。 具体地说,在这种情况下,我想要的是针对每个城市和等级,计算每行中的零个数,然后取零个数最少的行。

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

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

预期的输出是这样的:

enter image description here

我该怎么做?任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

您可以使用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