2013-07-17 5 views
0

Примеры данных. Я не уверен, как использовать систему кодовых блоков на SO еще.R Кадр данных подмножества и выполнять функцию на основе столбцов

df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(1990,1991,1992,1990,1991,1992,1990,1991,1992),c(1,2,3,3,2,1,2,1,3)) 
colnames(df) <- c("id", "year", "value") 

Это генерирует простую матрицу.

id year value
1 1990 1
1 1991 2
1 1992 3
2 1990 3
2 1991 2
2 1992 1
3 1990 2
3 1991 1
3 1992 3

я перебирать R Подменит вопросы, и не мог понять, второй шаг в ddply функции {plyr}, приложенной к нему.

Логика: для всех подгрупп ID найдите самое высокое значение (которое равно 3) в самый ранний момент времени.

Я смущен относительно того, какой синтаксис использовать здесь. От поиска SO я думаю, что ddply - лучший выбор, но не может понять, как это сделать. В идеале, мой вывод должен быть вектором UNIQUE ID (как только один выбран, с целым рядом, взятым с ним. Это не работает в R для меня, но его лучшая «логика» я мог бы придумать.

ddply((ddply(df,id)), year, which.min(value))

Например

id year value
1 1992 3
2 1990 3
3 1992 3

Если 3 нет в наличии, следующий по величине (2 или 1) должны быть приняты. Любые идеи?

ответ

2

Вы должны понимать, что ddplyразбивает исходный файл data.frame на data.frames в соответствии с разделительной переменной (-ами). Таким образом, ему нужна функция с data.frame в качестве аргумента и возвращаемого значения.

library(plyr) 
ddply(df,.(id),function(DF) {res <- DF[which.max(DF$value),] 
          res[which.min(res$year),]}) 

# id year value 
# 1 1 1992  3 
# 2 2 1990  3 
# 3 3 1992  3 
+0

Спасибо! Я еще не записал много функций в R, так что там я и попался. Если я это понимаю, ddply генерирует кадр данных, который можно манипулировать с помощью оператора функции (как вы указали выше). – ashah57

+0

Точно, 'ddply' разбивается на data.frames, которые передаются функции. Функция возвращает data.frames в 'ddply', что в свою очередь объединяет их. – Roland

+0

Я вернулся к этой функции, которую вы написали 4 раза - это было прекрасно, Роланд. – ashah57

0

Я считаю, что data.table является лучшим инструментом для вас (как для скорости и синтаксических причинам):

library(data.table) 
dt = data.table(df) 

# order by year, and then take the first row for each id that has max 'value' 
dt[order(year), .SD[which.max(value)], by = id] 
# id year value 
#1: 1 1992  3 
#2: 2 1990  3 
#3: 3 1992  3 

# if you're after speed, this slightly worse syntax is the current way of achieving it 
dt[dt[order(year), .I[which.max(value)], by = id]$V1] 
+0

Это, похоже, сработало - оно соответствовало тому, что Роланд опубликовал с точки зрения результатов. Большое спасибо eddi. – ashah57

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