我想知道是否有一种更简单的方法,而不是写...如果......其他......对于以下情况。我有一个数据框,我只想要列“百分比”> = 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.如果多于一个,全部选择它们。
答案 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