Очень просто с data.table
, поскольку он так хорошо группируется через by
.Воспроизводимый пример:
R> suppressMessages(library(data.table))
R> set.seed(123) # make it reproducible
R> N <- 100 # arbitrary
R> x <- data.table(city=sample(LETTERS, N, replace=TRUE), vote=runif(N, 0, 100))
R> setkey(x, city) # for sorted display and faster access, but not required
R> head(x, 12)
city vote
1: A 52.1136
2: A 74.6568
3: B 89.0350
4: B 95.4091
5: B 84.7453
6: C 72.0596
7: C 35.3905
8: C 58.1750
9: C 59.4343
10: C 65.9230
11: D 69.0007
12: D 31.1702
R>
Теперь, когда у нас есть данные, фактическая задача является однострочной:
R> x[, high := vote==max(vote), by=city] # assign vote==max(vote) by city
R>
R> head(x, 12)
city vote high
1: A 52.1136 FALSE
2: A 74.6568 TRUE
3: B 89.0350 FALSE
4: B 95.4091 TRUE
5: B 84.7453 FALSE
6: C 72.0596 TRUE
7: C 35.3905 FALSE
8: C 58.1750 FALSE
9: C 59.4343 FALSE
10: C 65.9230 FALSE
11: D 69.0007 FALSE
12: D 31.1702 FALSE
R>
При этом используется логическое значение как результат 'is itсравнение максимального значения, если вам действительно нужно целое число, вы, конечно, можете привести его:
R> x[, high:=NULL] # remove first as we change type
R> x[, high := as.integer(vote==max(vote)), by=city]
R> head(x,12)
city vote high
1: A 52.1136 0
2: A 74.6568 1
3: B 89.0350 0
4: B 95.4091 1
5: B 84.7453 0
6: C 72.0596 1
7: C 35.3905 0
8: C 58.1750 0
9: C 59.4343 0
10: C 65.9230 0
11: D 69.0007 0
12: D 31.1702 0
R>
Редактировать: Мое выражение было слишком сложным и было упрощено.