Фрейм данных программирования R - возвращаемое значение на основе позиции

Мне было интересно, есть ли способ получить значение на основе положения в векторе, например, у меня есть фрейм данных с двумя векторами, я сгруппировал их из необработанных данных по V1, а их по V2, очень похоже на ЗАКАЗ ПО в SQL. Моя проблема возникает, когда я пытаюсь выбрать 3-ю минуту для типа группы V1.

Заказанный фрейм данных...

V1  V2
Ford    18
Ford    16
Ford    15
Ford    14
Ford    12
**Ford  5**
Ford    2
Ford    1
Nisan   10
Nisan   9
Nisan   8
Nisan   7
Nisan   6
**Nisan     5**
Nisan   4
Nisan   3
Toyota  20
Toyota  19
Toyota  15
Toyota  12
Toyota  11
**Toyota    10**
Toyota  6
Toyota  2

Результат, который я хочу получить в новом фрейме данных, 3-е минимальное значение для каждой переменной...

V1 V2
Ford 5
Nisan 5
Toyota 10

Заранее спасибо.


person antimuon    schedule 04.05.2015    source источник


Ответы (2)


С базой R вы можете сделать что-то вроде

aggregate(V2 ~ V1, df[order(df$V2), ], `[`, 3L)
#       V1 V2
# 1   Ford  5
# 2  Nisan  5
# 3 Toyota 10

Или (согласно комментарию @akruns), используя ave

df[with(df, ave(V2, V1, FUN = order)) == 3L,]
person David Arenburg    schedule 04.05.2015
comment
Спасибо. Я использовал агрегат (V2 ~ V1, df[order(df$V2), ], function(x) x[3L]) и получил то, что мне было нужно! - person antimuon; 04.05.2015

Пытаться

library(data.table)#v1.9.5+
setDT(df1)[order(V2), list(V2=V2[3L]), by = V1]

Или как @DavidArenburg упомянул в комментариях

setDT(df1)[, .SD[frank(V2, ties.method = "dense") == 3L], by = V1]

Or

library(dplyr)
 df1 %>% 
     group_by(V1) %>%
     filter(rank(V2)==3)

Or

 df1 %>%
     group_by(V1) %>% 
     arrange(V2) %>%
     slice(3L)
person akrun    schedule 04.05.2015