我有以下数据集:
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中都有多个条目
由于
答案 0 :(得分:2)
使用dplyr
包对Var1
进行分组,以计算Var2
和Var3
列的非零值。根据哪个计数更大,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)