2016-04-28 2 views
1

Я пытаюсь сделать линейное приближение для каждого id в кадре данных между year с использованием точки x. dplyr кажется, как подходящий вариант для этого, но я не могу заставить его работать из-за ошибки:Использование приблизительно в dplyr

Error: incompatible size (9), expecting 3 (the group size) or 1

Пример кода:

library(dplyr) 
dat <- data.frame(id = c(1,1,1,2,2,2,3,3,3), year = c(1,2,3,1,2,3,1,2,3), x = c(1,NA,2, 3, NA, 4, 5, NA, 6)) 

# Linear Interpolation 
dat %>% 
    group_by(id) %>% 
    mutate(x2 = as.numeric(unlist(approx(x = dat$year, y = dat$x, xout = dat$x)[2]))) 

Образец данных:

id year x 
1 1 1 1 
2 1 2 NA 
3 1 3 2 
4 2 1 3 
5 2 2 NA 
6 2 3 4 
7 3 1 5 
8 3 2 NA 
9 3 3 6 
+0

Спасибо, но у вас есть решение 'dplyr'? – Vedda

+0

@ G.Grothendieck Спасибо. Это сработает. Добавьте ответ, и я возьму – Vedda

ответ

4

Вот несколько подходов (переданный из комментариев):

1) na.approx/пр

library(zoo) 

transform(dat, x2 = ave(x, id, FUN = na.approx)) 

С годом, равными 1, 2, 3, мы не не нужно указывать его, но если это было необходимо, то:

nr <- nrow(dat) 
transform(dat, x2 = ave(1:nr, id, FUN = function(i) with(dat[i, ], na.approx(x, year)))) 

2) na.approx/dplyr

library(dplyr) 
library(zoo) 

dat %>% 
    group_by(id) %>% 
     mutate(x2 = na.approx(x, year)) %>% 
    ungroup() 

Если год не нужен, оставьте второй аргумент na.approx.

Примечание: зоопарк также имеет другие функции наполнения NA, в частности na.spline и na.locf.

4

Вы можете сделать это в базе R:

dat <- dat[order(dat$id, dat$year),] 
dat$x2 <- unlist(by(dat, dat$id, function(df) approx(df$year, df$x, xout = df$year)[2])) 
dat 
    id year x x2 
1 1 1 1 1.0 
2 1 2 NA 1.5 
3 1 3 2 2.0 
4 2 1 3 3.0 
5 2 2 NA 3.5 
6 2 3 4 4.0 
7 3 1 5 5.0 
8 3 2 NA 5.5 
9 3 3 6 6.0 
+0

благодаря @thelatemail – HubertL

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