R根据多行删除最少计数的行

时间:2018-05-19 11:32:53

标签: r

我有以下数据集:

   Var1  Var2  Var3 Var4
1 Rank 1 Sub 1     0   10
2 Rank 1 Sub 1     0   20
3 Rank 2 Sub 2     0   30
4 Rank 1     0 Sub 1   40
5 Rank 2 Sub 2     0   50
6 Rank 2     0 Sub 2   10

我想删除基于Var2和Var3的值最小的行。例如,秩1(在Var1中)在Var2中有2个值,在Var3中有1个值。我想删除Rank 1中具有Var3值的所有条目,并保留所有具有Var2值的条目。这同样适用于所有其他Var1值。

所以最终结果将是:

       Var1  Var2  Var3 Var4
    1 Rank 1 Sub 1     0   10
    2 Rank 1 Sub 1     0   20
    3 Rank 2 Sub 2     0   30
    4 Rank 2 Sub 2     0   50

有办法吗?找到构建上表的代码:

Var1 = c("Rank 1", "Rank 1", "Rank 2", "Rank 1", "Rank 2")
Var2 = c("Sub 1", "Sub 1", "Sub 2","0", "Sub 2")
Var3 = c(0, "Sub 1", 0, "Sub 1", "0" )
Var4 = c(10,20, 30, 40,50)
df <- data.frame(Var1,Var2,Var3,Var4)

PS:这将是一个非常大的数据集,在Var2和Var3中都有多个条目

由于

1 个答案:

答案 0 :(得分:2)

使用dplyr包对Var1进行分组,以计算Var2Var3列的非零值。根据哪个计数更大,filter条件可以应用于各个列。 case_when将使逻辑更简单,更清晰。

library(dplyr)
df %>% mutate_if(is.factor, as.character) %>%
  group_by(Var1) %>% 
  filter( case_when(
    sum(Var2 != "0") >= sum(Var3 != "0") ~ Var2 != "0",
    sum(Var2 != "0") < sum(Var3 != "0") ~ Var3 != "0"
      ))
    # # A tibble: 4 x 4
# # Groups: Var1 [2]
# Var1   Var2  Var3   Var4
# <chr>  <chr> <chr> <int>
# 1 Rank 1 Sub 1 0        10
# 2 Rank 1 Sub 1 0        20
# 3 Rank 2 Sub 2 0        30
# 4 Rank 2 Sub 2 0        50

数据:

df <- read.table(text = 
"Var1  Var2  Var3 Var4
1 'Rank 1' 'Sub 1'     0   10
2 'Rank 1' 'Sub 1'     0   20
3 'Rank 2' 'Sub 2'     0   30
4 'Rank 1'     0 'Sub 1'   40
5 'Rank 2' 'Sub 2'     0   50
6 'Rank 2'     0 'Sub 2'   10",
stringsAsFactors = FALSE, header = TRUE)