在数据框中的不同对象中查找范围内的所有最大值

时间:2014-09-19 23:58:48

标签: r filter

我想知道是否有一种更简单的方法,而不是写...如果......其他......对于以下情况。我有一个数据框,我只想要列“百分比”> = 95的数字行。而且,对于一个对象,如果有多个行符合这个标准,我只想要最大的一个。如果有多个最大的,我想保留所有这些。

例如:

object  city    street  percentage
A   NY  Sun 100
A   NY  Malino  97
A   NY  Waterfall   100
B   CA  Washington  98
B   WA  Lieber  95
C   NA  Moon    75

然后我想结果显示:

object  city    street  percentage
A   NY  Sun 100
A   NY  Waterfall   100
B   CA  Washington  98

我能够使用if else语句来做,但我觉得应该有一些更聪明的方式来说:1。> = 95 2.如果不止一个,选择最大的3.如果多于一个,全部选择它们。

3 个答案:

答案 0 :(得分:2)

您可以通过创建一个变量来指明每个对象具有最大百分比的行。然后我们可以使用此指标对数据进行子集化。

# your data
dat <- read.table(text = "object  city    street  percentage
A   NY  Sun 100
A   NY  Malino  97
A   NY  Waterfall   100
B   CA  Washington  98
B   WA  Lieber  95
C   NA  Moon    75", header=TRUE, na.strings="", stringsAsFactors=FALSE)

# create an indicator to identify the rows that have the maximum
# percentage by object
id <- with(dat, ave(percentage, object, FUN=function(i) i==max(i)) )

# subset your data - keep rows that are greater than 95 and have the 
# maximum group percentage (given by id equal to one)
dat[dat$percentage >= 95 & id , ]

这可以通过add语句创建一个逻辑,然后可以用来对dat行进行子集化。

dat$percentage >= 95 & id
#[1] TRUE FALSE  TRUE  TRUE FALSE FALSE

或将这些放在一起

with(dat, dat[percentage >= 95 & ave(percentage, object, 
                                           FUN=function(i) i==max(i)) , ])

#   object city     street percentage
# 1      A   NY        Sun        100
# 3      A   NY  Waterfall        100
# 4      B   CA Washington         98

答案 1 :(得分:2)

您也可以使用{user20650

中的相同方法在data.table中执行此操作
library(data.table)
 setDT(dat)[dat[,percentage==max(percentage) & percentage >=95, by=object]$V1,] 
 #   object city     street percentage
 #1:      A   NY        Sun        100
 #2:      A   NY  Waterfall        100
 #3:      B   CA Washington         98

或使用dplyr

 dat %>% 
     group_by(object) %>%
     filter(percentage==max(percentage) & percentage >=95)

答案 2 :(得分:0)

以下作品:

ddf2 = ddf[ddf$percentage>95,]
ddf3 = ddf2[-c(1:nrow(ddf2)),]
for(oo in unique(ddf2$object)){
    tempdf = ddf2[ddf2$object == oo, ]
    maxval = max(tempdf$percentage)
    tempdf = tempdf[tempdf$percentage==maxval,]
    for(i in 1:nrow(tempdf)) ddf3[nrow(ddf3)+1,] = tempdf[i,]
}
ddf3
 object city     street percentage
1      A   NY        Sun        100
3      A   NY  Waterfall        100
4      B   CA Washington         98