2016-06-16 3 views
0

Примечание: Это сообщение относится к другому сообщению (Recoding longitudinal variables in R)R data.table: выход превращается в различные значения, перекодирование переменных

У меня есть data.table, и я хочу, чтобы перекодировать значения переменной (homes) с кондиционером к значениям других переменных. По сути, я хочу, чтобы наблюдение, соответствующее month == "1", и year == "2011" было значением в month == "12" и year == "2010". data.table выглядит следующим образом:

> head(test,25) 
         LA month year entry exit total homes 
1: Barking and Dagenham 10 2010  2 0  2 NA 
2: Barking and Dagenham 11 2010  3 0  3 NA 
3: Barking and Dagenham 12 2010  3 0  3 15 
4: Barking and Dagenham  1 2011  6 0  6 NA 
5: Barking and Dagenham  2 2011  1 0  1 NA 
6: Barking and Dagenham  3 2011  2 0  2 NA 
7: Barking and Dagenham  4 2011  1 0  1 NA 
8: Barking and Dagenham 10 2011  1 0  1 NA 
9: Barking and Dagenham 11 2011  1 0  1 NA 
10: Barking and Dagenham  1 2012  1 0  1 NA 
11: Barking and Dagenham  9 2012  1 0  1 NA 
12: Barking and Dagenham  6 2013  2 0  2 NA 
13: Barking and Dagenham  1 2014  0 1 -1 NA 
14: Barking and Dagenham 12 2014  0 1 -1 NA 
15: Barking and Dagenham  3 2015  1 1  0 NA 
16: Barking and Dagenham 11 2015  1 1  0 NA 
17: Barking and Dagenham 12 2015  1 0  1 NA 
18:    Barnet 11 2010 24 0 24 NA 
19:    Barnet 12 2010 28 0 28 86 
20:    Barnet  1 2011 28 0 28 NA 
21:    Barnet  2 2011  6 0  6 NA 
22:    Barnet  3 2011  1 0  1 NA 
23:    Barnet  4 2011  1 0  1 NA 
24:    Barnet  7 2011  2 0  2 NA 
25:    Barnet  8 2011  1 0  1 NA 
         LA month year entry exit total homes 

Структура этого data.table выглядит следующим образом:

Classes ‘data.table’ and 'data.frame': 4664 obs. of 7 variables: 
$ LA : Factor w/ 151 levels "Barking and Dagenham",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ month: int 10 11 12 1 2 3 4 10 11 1 ... 
$ year : int 2010 2010 2010 2011 2011 2011 2011 2011 2011 2012 ... 
$ entry: int 2 3 3 6 1 2 1 1 1 1 ... 
$ exit : int 0 0 0 0 0 0 0 0 0 0 ... 
$ total: int 2 3 3 6 1 2 1 1 1 1 ... 
$ homes: int NA NA 15 NA NA NA NA NA NA NA ... 

Для того, чтобы перекодировать homes создать новую переменную homes.1. Я использую следующие data.table функции:

test = test[year== "2011" & month == "1", homes.1 := as.numeric(!is.na(homes)), by = LA] 

test[, homes.1 := ifelse(!is.na(homes.1), 
         test[month == "12" & year == "2010",homes], 
         homes.1), by=LA] 

я получаю частично то, что я хочу. Переменные homes.1 перекодируются, но имеют разные значения, чем те, которые соответствуют переменным домам. Первые 25 наблюдения test взгляда:

LA month year entry exit total homes homes.1 
1: Barking and Dagenham 10 2010  2 0  2 NA  NA 
2: Barking and Dagenham 11 2010  3 0  3 NA  NA 
3: Barking and Dagenham 12 2010  3 0  3 15  NA 
4: Barking and Dagenham  1 2011  6 0  6 NA  46 
5: Barking and Dagenham  2 2011  1 0  1 NA  NA 
6: Barking and Dagenham  3 2011  2 0  2 NA  NA 
7: Barking and Dagenham  4 2011  1 0  1 NA  NA 
8: Barking and Dagenham 10 2011  1 0  1 NA  NA 
9: Barking and Dagenham 11 2011  1 0  1 NA  NA 
10: Barking and Dagenham  1 2012  1 0  1 NA  NA 
11: Barking and Dagenham  9 2012  1 0  1 NA  NA 
12: Barking and Dagenham  6 2013  2 0  2 NA  NA 
13: Barking and Dagenham  1 2014  0 1 -1 NA  NA 
14: Barking and Dagenham 12 2014  0 1 -1 NA  NA 
15: Barking and Dagenham  3 2015  1 1  0 NA  NA 
16: Barking and Dagenham 11 2015  1 1  0 NA  NA 
17: Barking and Dagenham 12 2015  1 0  1 NA  NA 
18:    Barnet 11 2010 24 0 24 NA  NA 
19:    Barnet 12 2010 28 0 28 86  NA 
20:    Barnet  1 2011 28 0 28 NA  55 
21:    Barnet  2 2011  6 0  6 NA  NA 
22:    Barnet  3 2011  1 0  1 NA  NA 
23:    Barnet  4 2011  1 0  1 NA  NA 
24:    Barnet  7 2011  2 0  2 NA  NA 
25:    Barnet  8 2011  1 0  1 NA  NA 
         LA month year entry exit total homes homes.1 

Кроме того, структура test с homes.1 является:

> str(test) 
Classes ‘data.table’ and 'data.frame': 4664 obs. of 8 variables: 
$ LA  : Factor w/ 151 levels "Barking and Dagenham",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ month : int 10 11 12 1 2 3 4 10 11 1 ... 
$ year : int 2010 2010 2010 2011 2011 2011 2011 2011 2011 2012 ... 
$ entry : int 2 3 3 6 1 2 1 1 1 1 ... 
$ exit : int 0 0 0 0 0 0 0 0 0 0 ... 
$ total : int 2 3 3 6 1 2 1 1 1 1 ... 
$ homes : int NA NA 15 NA NA NA NA NA NA NA ... 
$ homes.1: num NA NA NA 46 NA NA NA NA NA NA ... 
- attr(*, ".internal.selfref")=<externalptr> 

Интересно, почему он не перекодирование должным образом замечания homes.1 согласно homes значений , Ожидаемый результат должен выглядеть следующим образом:

 LA month year entry exit total homes homes.1 
1: Barking and Dagenham 10 2010  2 0  2 NA  NA 
2: Barking and Dagenham 11 2010  3 0  3 NA  NA 
3: Barking and Dagenham 12 2010  3 0  3 15  NA 
4: Barking and Dagenham  1 2011  6 0  6 NA  15 
5: Barking and Dagenham  2 2011  1 0  1 NA  NA 
6: Barking and Dagenham  3 2011  2 0  2 NA  NA 
7: Barking and Dagenham  4 2011  1 0  1 NA  NA 
8: Barking and Dagenham 10 2011  1 0  1 NA  NA 
9: Barking and Dagenham 11 2011  1 0  1 NA  NA 
10: Barking and Dagenham  1 2012  1 0  1 NA  NA 
11: Barking and Dagenham  9 2012  1 0  1 NA  NA 
12: Barking and Dagenham  6 2013  2 0  2 NA  NA 
13: Barking and Dagenham  1 2014  0 1 -1 NA  NA 
14: Barking and Dagenham 12 2014  0 1 -1 NA  NA 
15: Barking and Dagenham  3 2015  1 1  0 NA  NA 
16: Barking and Dagenham 11 2015  1 1  0 NA  NA 
17: Barking and Dagenham 12 2015  1 0  1 NA  NA 
18:    Barnet 11 2010 24 0 24 NA  NA 
19:    Barnet 12 2010 28 0 28 86  NA 
20:    Barnet  1 2011 28 0 28 NA  86 
21:    Barnet  2 2011  6 0  6 NA  NA 
22:    Barnet  3 2011  1 0  1 NA  NA 
23:    Barnet  4 2011  1 0  1 NA  NA 
24:    Barnet  7 2011  2 0  2 NA  NA 
25:    Barnet  8 2011  1 0  1 NA  NA 
         LA month year entry exit total homes homes.1 
+0

Я думаю, что это причина условий, которые вы предоставляете функции data.table. Сначала вам нужно создать переменную 'homes.1'. –

+0

Это поможет, если вы будете использовать данные примера. Я предполагаю, что вы можете сделать что-то вроде слияния – Frank

+0

, вы должны включить код для создания набора данных, чтобы сделать ваш вопрос воспроизводимым – jangorecki

ответ

1

Вы получаете 0, потому что для строк, где year== "2011" & month == "1" Выражение is.na(homes) возвращает TRUE, поэтому, когда вы делаете !is.na(homes) возвращает FALSE.
После того, как вы создали переменные с нулевыми значениями, вызывающими переменные, числовое значение автоматически преобразует TRUE в 1 и FALSE в 0.

Однако это не является проблемой. Вы можете заменить эти 0 значения с другим утверждением, которое должно выглядеть следующим образом:

test[, homes.1 := ifelse(!is.na(homes.1), 
        test[month == "12" & year == "2010",homes], 
        homes.1), 
     by=LA] 

Не могли бы вы сказать мне, если это работает? Если это так, то вы можете просто объединить два столбца.

+1

Я думаю, что это не сработает так, как написано, так как '.SD'« заблокирован »/ не может редактироваться. – Frank

+0

Я отредактировал свой комментарий: не может ли он работать так? Без данных трудно сказать что-нибудь .. – hellter

+0

Хм, да, что-то подобное может сработать. Да, нам придется подождать, пока кто-то не предоставит данные ОП в воспроизводимой форме, прежде чем мы сможем убедиться, я думаю. – Frank

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