2015-02-23 3 views
0

Я хотел бы группировать данные по некоторым столбцам, а затем заменить NA последним наблюдением. Есть ли способ применить функцию, отличную от функции агрегации, к результату group_by?Как применить самоопределяемую функцию по результату group_by

Вот два образца осуществляется с ddply:

1:

dt<-data.table(A=rep(c(1:3),2), B=c(1,2,NA,NA,2,5),C=c(9,NA,2,8,NA,4) 
ddply(dt,"A",function(x){na.locf(x, na.rm = FALSE,fromLast=FALSE)}) 

2:

ddply(dt,"A",function(x){ 
if (x[1,"A"]>2){ 
    x[,2:3]*1 
} else { 
    x[,2:3]*(-1) 
} 

}) 

Я не знаю, как повторить его с groug_by, который должен быть быстрее чем ddply. Кстати, есть ли функция замены NA быстрее, чем na.locf?

Большое спасибо заранее.

ответ

3

Вот как вы могли бы сделать это с dplyr

dt %>% 
    group_by(A) %>% 
    mutate_each(funs(na.locf(., na.rm = FALSE, fromLast = FALSE))) 

Но если вы уже используете data.table, почему бы не использовать его?

dt[, lapply(.SD, na.locf, na.rm = FALSE, fromLast = FALSE), by = A] 

Вы также можете обновить таблицу данных по ссылке с помощью оператора := как в

dt[, names(dt)[-1] := lapply(.SD, na.locf, na.rm = FALSE, fromLast = FALSE), A] 
+0

Спасибо за ответ. Если мы используем в таблице data.table, можем ли мы выполнить условие if-else? В примере, если A == 1, вычислите среднее значение другого стандартного отклонения. @Давид Аренбург – YYY