我正在尝试根据不同列上的最大值删除数据框中的重复行
因此,对于数据框:
df<-data.frame (rbind(c("a",2,3),c("a",3,4),c("a",3,5),c("b",1,3),c("b",2,6),c("r",4,5))
colnames(df)<-c("id","val1","val2")
id val1 val2
a 2 3
a 3 4
a 3 5
b 1 3
b 2 6
r 4 5
我想通过id删除所有重复项,条件是对于相应的行,它们没有val2的最大值。
因此数据框应该变为:
a 3 5
b 2 6
r 4 5
- &GT;删除所有重复项但保留df $ val2的最大值的行为子集(df,df $ id ==“a”)
答案 0 :(得分:7)
使用base R
。这里的列是factors
。请务必将其转换为numeric
df$val2 <- as.numeric(as.character(df$val2))
df[with(df, ave(val2, id, FUN=max)==val2),]
# id val1 val2
#3 a 3 5
#5 b 2 6
#6 r 4 5
或使用dplyr
library(dplyr)
df %>%
group_by(id) %>%
filter(val2==max(val2))
# id val1 val2
#1 a 3 5
#2 b 2 6
#3 r 4 5
答案 1 :(得分:6)
一种可能的方法是使用data.table
library(data.table)
setDT(df)[, .SD[which.max(val2)], by = id]
## id val1 val2
## 1: a 3 5
## 2: b 2 6
## 3: r 4 5
答案 2 :(得分:2)
以下是我希望您的数据真正设置的方式
df <- data.frame (id = c(rep("a", 3), rep("b", 2), "r"),
val1 = c(2, 3, 3, 1, 2, 4), val2 = c(3, 4, 5, 3, 6, 5))
您可以split
- unsplit
> unsplit(lapply(split(df, df$id), function(x) {
if(nrow(x) > 1) {
x[duplicated(x$id) & x$val2 == max(x$val2),]
} else {
x
}
}), levels(df$id))
# id val1 val2
# 3 a 3 5
# 5 b 2 6
# 6 r 4 5
您也可以使用Reduce(rbind, ...)
或do.call(rbind, ...)
代替unsplit
答案 3 :(得分:0)
另一个
df %>% group_by(id) %>%
slice(which.max(val2))
id val1 val2
a 3 5
b 2 6
r 4 5