2015-01-22 3 views
2

Предположим, что у меня есть dataframe:добывающие переменные в R с использованием частот

x y 
a 1 
b 2 
a 3 
a 4 
b 5 
c 6 
a 7 
d 8 
a 9 
b 10 
e 12 
b 13 
c 15 

Я хочу, чтобы создать другой dataframe который включает в себя только x значения, которые возникают, по крайней мере в 3 раза (a и b, в данном случае), и их наивысшие соответствующие значения y.

Так что я хочу, выход как:

x y 
a 9 
b 13 

Здесь 9 и 13 являются высокие значения a и b соответственно

Я попытался с помощью:

sort-(table(x,y)) 

, но это не так Работа.

ответ

6

Вот один из способов, с помощью subset опустить любую x, которые происходят менее чем в 3 раза, а затем aggregate найти максимальное значение по группе:

d <- read.table(text='x y 
a 1 
b 2 
a 3 
a 4 
b 5 
c 6 
a 7 
d 8 
a 9 
b 10 
e 12 
b 13 
c 15', header=TRUE) 


with(subset(d, x %in% names(which(table(d$x) >= 3))), 
    aggregate(list(y=y), list(x=x), max)) 

# x y 
# 1 a 9 
# 2 b 13 

И для хорошей меры, dplyr подход:

library(dplyr) 
d %>% 
    group_by(x) %>% 
    filter(n() >= 3) %>% 
    summarise(max(y)) 


# Source: local data frame [2 x 2] 
# 
# x max(y) 
# 1 a  9 
# 2 b  13 
+3

'aggregate (y ~ x, data = with (dat, dat [ave (y, x, FUN = length)> = 3,]), FUN = max)' в качестве альтернативы, используя аналогичную логику. – thelatemail

+0

@thelatemail - приятно, что кажется более приятным для глаз. – jbaums

+0

Спасибо @jbaums :) – Learner27

7

Пакет data.table подходит для этого. Если df это исходные данные, вы можете сделать

library(data.table) 
setDT(df)[, .(y = max(y)[.N >= 3]), by=x] 
# x y 
# 1: a 9 
# 2: b 13 

.N представляет собой целое число, которое говорит нам, сколько строк в каждой группе (которую мы установили в x здесь). Поэтому мы просто подмножаем max(y) таким образом, что .N составляет не менее трех.

+1

Мне действительно нужно научиться 'data.table' ... – jbaums

+1

спасибо @Richard – Learner27

+1

ясный ответ, +1 –

Смежные вопросы