Создайте переменную на основе значений двух лет из другой переменной в R - PullRequest
0 голосов
/ 03 апреля 2020

Это выглядит просто, но я не смог найти ответ в Интернете. У меня есть данные панели с характеристиками города за 1995-2015 годы. Для некоторых переменных у меня есть только данные за 2000 и 2010 годы. Поэтому я хочу создать новые переменные, в которых я добавляю недостающие данные за 1995-2004 годы со значениями 2000 года и 2005-2015 годы со значениями 2010 года.

Мой набор данных выглядит следующим образом:

   cities  idhm year
1       B    NA 1995
2       C    NA 1996
3       D    NA 1997
4       E    NA 1998
5       F    NA 1999
6       G 24599 2000
7       H    NA 2001
8       I    NA 2002
9       J    NA 2003
10      K    NA 2004
11      L    NA 2005
12      M    NA 2006
13      N    NA 2007
14      O    NA 2008
15      P    NA 2009
16      Q  5598 2010
17      R    NA 2011
18      S    NA 2012
19      T    NA 2013
20      U    NA 2014
21      V    NA 2015

Я хочу иметь такой набор данных:

   cities  idhm year newvar
1       B    NA 1995  24599
2       C    NA 1996  24599
3       D    NA 1997  24599
4       E    NA 1998  24599
5       F    NA 1999  24599
6       G 24599 2000  24599
7       H    NA 2001  24599
8       I    NA 2002  24599
9       J    NA 2003  24599
10      K    NA 2004  24599
11      L    NA 2005   5598
12      M    NA 2006   5598
13      N    NA 2007   5598
14      O    NA 2008   5598
15      P    NA 2009   5598
16      Q  5598 2010   5598
17      R    NA 2011   5598
18      S    NA 2012   5598
19      T    NA 2013   5598
20      U    NA 2014   5598
21      V    NA 2015   5598

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Я подозреваю, что ваши данные могут быть больше, чем в этом примере, поэтому в более общем случае можно использовать скользящее соединение. Я считаю, что проще всего с data.table.

Сначала создайте словарь полных данных для присоединения.

library(data.table)
setDT(data1)
dictionary <- data1[!is.na(idhm),.(year,idhm)]
dictionary
#   year  idhm
#1: 2000 24599
#2: 2010  5598

Затем выполните объединение on = "year" и roll = "nearest".

result <- dictionary[data1,on = "year",roll="nearest"]
result[,.(cities,year,idhm)]
#   cities year  idhm
# 1:      B 1995 24599
# 2:      C 1996 24599
# 3:      D 1997 24599
# 4:      E 1998 24599
# 5:      F 1999 24599
# 6:      G 2000 24599
# 7:      H 2001 24599
# 8:      I 2002 24599
# 9:      J 2003 24599
#10:      K 2004 24599
#11:      L 2005 24599
#12:      M 2006  5598
#13:      N 2007  5598
#14:      O 2008  5598
#15:      P 2009  5598
#16:      Q 2010  5598
#17:      R 2011  5598
#18:      S 2012  5598
#19:      T 2013  5598
#20:      U 2014  5598
#21:      V 2015  5598
#    cities year  idhm

Данные

data1 <- structure(list(cities = structure(1:21, .Label = c("B", "C", 
"D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", 
"Q", "R", "S", "T", "U", "V"), class = "factor"), idhm = c(NA, 
NA, NA, NA, NA, 24599L, NA, NA, NA, NA, NA, NA, NA, NA, NA, 5598L, 
NA, NA, NA, NA, NA), year = 1995:2015), class = "data.frame", row.names = c(NA, 
-21L))
1 голос
/ 03 апреля 2020

Мы можем сделать:

df$new_var <- NA
df$new_var[df$year >= 1995 & df$year <= 2004] <- df$idhm[df$year == 2000]
df$new_var[df$year >= 2005 & df$year <= 2015] <- df$idhm[df$year == 2010]

Или используя dplyr:

library(dplyr)

df %>%
   mutate(new_var = case_when(between(year, 1995, 2004) ~idhm[year == 2000], 
                         between(year, 2005, 2015) ~idhm[year == 2010]))


#   cities  idhm year new_var
#1       B    NA 1995   24599
#2       C    NA 1996   24599
#3       D    NA 1997   24599
#4       E    NA 1998   24599
#5       F    NA 1999   24599
#6       G 24599 2000   24599
#7       H    NA 2001   24599
#8       I    NA 2002   24599
#9       J    NA 2003   24599
#10      K    NA 2004   24599
#11      L    NA 2005    5598
#12      M    NA 2006    5598
#13      N    NA 2007    5598
#14      O    NA 2008    5598
#15      P    NA 2009    5598
#16      Q  5598 2010    5598
#17      R    NA 2011    5598
#18      S    NA 2012    5598
#19      T    NA 2013    5598
#20      U    NA 2014    5598
#21      V    NA 2015    5598
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...