Функция в R для выбора строки с наибольшим значением - PullRequest
0 голосов
/ 29 сентября 2018

У меня есть датафрейм со столбцами для названия города и процента голосов наряду с другими полями.В каждом городе более одного кандидата, и каждый кандидат имеет свою долю голосов, поэтому столбец с названием города имеет несколько строк для одного города.Там нет колонки для победителя.Итак, я хочу добавить 1 столбец для этого, чтобы я мог провести анализ по этому вопросу.

Мне нужна помощь в написании функции, которая обрабатывает долю голосов кандидатов для определенного города (несколько строк), а затем присваивает значение 1 парню с наибольшей долей голосов.

Изображение кадра данных:

enter image description here

Существует более 5000 строк для более чем 400 городов.

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Очень просто с 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> 

Редактировать: Мое выражение было слишком сложным и было упрощено.

0 голосов
/ 29 сентября 2018

Вот решение с одной строкой, использующее базу R -

df <- data.frame(City = c("A", "A", "B", "B"),
                         Candidate = letters[23:26],
                         Votes = sample.int(1000, 4), stringsAsFactors = F)

df$Flag <- ave(df$Votes, df$City, FUN = function(x) x == max(x))

#      City Candidate Votes Flag
# 1    A         w    14    0
# 2    A         x   412    1
# 3    B         y    50    0
# 4    B         z   969    1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...