2015-01-28 3 views
2

Я ищу, чтобы применить функцию к кадру данных, а затем сохранить результаты этой функции в новом столбце в фрейме данных.R: применение функции по группе

Вот пример моего кадра данных, tradeData:

Login AL Diff 
    a 1 0 
    a 1 0 
    a 1 0 
    a 0 1 
    a 0 0 
    a 0 0 
    a 0 0 
    a 1 -1 
    a 1 0 
    a 0 1 
    a 1 -1 
    a 1 0 
    a 0 1 
    b 1 0 
    b 0 1 
    b 0 0 
    b 0 0 
    b 1 -1 
    c 1 0 
    c 1 0 
    c 0 1 
    c 0 0 
    c 1 -1 

Если в колонке «Diff» есть столбец Я пытаюсь добавить. Это просто разница между значениями строк (x-1) и строки (x) tradeData, сгруппированными по имени пользователя.

Вот некоторые примеры того, что я пробовал:

tradeData$Diff = ave(tradeData$AL,tradeData$Login,FUN = function(x) {diff(x)}) 

и

tradeData$Diff = as.data.frame(with(tradeData,tapply(AL,Login,FUN = diff))) 

Я нашел следующий вопрос полезным до сих пор: R applying a function to a subset of a data frame, но я не уверен, как поступить с здесь, поскольку я продолжаю получать ошибки.

Благодаря

ответ

3

Вы можете попробовать

with(tradeData, ave(AL, Login, FUN=function(x) -1*c(0, diff(x)))) 
#[1] 0 0 0 1 0 0 0 -1 0 1 -1 0 1 0 1 0 0 -1 0 0 1 0 -1 

Или вариант с использованием data.table. Преобразуйте «data.frame» в «data.table» с setDT. Возьмите разницу между текущим и следующим значением по группе (by=Login). Функция shift (представленная в новой версии devel) с type равна «ведущему», получает следующее значение.

library(data.table)#data.table_1.9.5 
setDT(tradeData)[, Diff:=AL-shift(AL, type='lead', 
          fill=0) , by=Login][] 
Смежные вопросы