2014-11-28 2 views
1

У меня есть кадр данных с человеко-годами наблюдений по ряду переменных. Это выглядит следующим образом:Приложение R plyr для заполнения недостающих значений

year  serial moved urban.rural.code 
15 1982  1000_1  0    0 
16 1983  1000_1  0    0 
17 1984  1000_1  0    0 
18 1985  1000_1  1    0 
19 1986  1000_1  1    1 
20 1981  1000_2  0    1 
21 1982  1000_2  0    1 
22 1983  1000_2  0    1 
23 1984  1000_2  0    0 
24 1985  1000_2  0    9 
25 1996  1000_2  0    1 
26 1993  1000_3  0    1 
27 1994  1000_3  0    1 
28 1984  1000_4  0    0 
29 1985  1000_4  0    7 
30 1987  1000_5  0    1 
31 1984  1000_6  0    0 
32 1999  1000_6  0    8 

Для каждого наблюдения в течение серийного номера, если наблюдение было зафиксировано в 1985 году и имеет значение moved = 0 в 1895 году, то я хочу, чтобы назначить urban.rural.code в 1984 году до его значение в 1985 году. В приведенном выше примере urban.rural.code ТОЛЬКО для строк 23 и 28 следует назначить соответственно 9 и 7.

Я использовал комбинацию ddply и вспомогательную функцию, которая выглядит следующим образом:

fill1984 <- function(group) { 
    if((1984 %in% group$year) & (group[group$year == 1985, 'moved'] == 0)) { 
     group[group$year == 1984, 'urban.rural.code'] <- group[group$year == 1985,  'urban.rural.code'] 
     } 
    return(group) 
} 

data <- ddply(data, 'serial', fill1984, .parallel=TRUE)  

И я получаю следующее сообщение об ошибке:

Error in do.ply(i) : task 2 failed - "argument is of length zero" 
In addition: Warning message: 
In setup_parallel() : No parallel backend registered 

Я не знаю, где я Я ошибаюсь. Как внести изменения в urban.rural.code в каждую группу serial?

ответ

0

Это в dplyr и может быть в состоянии быть очищены некоторые, но это выглядит, как это работает:

library(dplyr) 
newdf <- data %>% 
      group_by(serial) %>% 
      mutate(
      cidx = year == 1985 & moved == 0, 
      urban.rural.code = ifelse(year == 1984 & isTRUE(cidx[year==1985]), 
             urban.rural.code[year == 1985], 
             urban.rural.code) 
     )