【问题标题】:Create a variable based on values of two years from another variable in R根据 R 中另一个变量的两年值创建一个变量
【发布时间】:2020-07-15 04:17:34
【问题描述】:

看起来很简单,但我在网上找不到答案。我有 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

欢迎任何帮助。

【问题讨论】:

    标签: r missing-data panel-data data-transform


    【解决方案1】:

    我怀疑您的数据可能比此示例大,因此更一般的情况是使用滚动联接。我发现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))
    

    【讨论】:

    • 谢谢!将数据转换为数字后,我收到以下消息: *"Error in vecseq(f_, len__, if (allow.cartesian || notjoin || !anyDuplicated(f__, : Join results in 64072159 rows) ; 超过 130889 = nrow(x)+nrow(i)。检查 i 中的重复键值,每个键值都一遍又一遍地加入 x 中的同一组。如果没问题,请尝试 by=.EACHI 运行 j每个组以避免大量分配。如果您确定要继续,请使用 allow.cartesian=TRUE 重新运行。" 我尝试使用 try by=.EACHI,但没有成功。
    【解决方案2】:

    我们可以做到:

    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
    

    【讨论】:

    • 谢谢!我无法使用第一种方法进行合并,因为“下标分配中不允许使用 NA”。然后,我尝试了第二种方法,我得到了这条消息:“错误:内部错误:跟踪数据不是方形的。”我仍在试图找出问题所在。如果您有任何建议,我将不胜感激。
    • @user1290547 在我看来你的数据中有NA,你可以使用df$new_var[which(df$year &gt;= 1995 &amp; df$year &lt;= 2004)] &lt;- df$idhm[which(df$year == 2000)[1]],对于第二种情况也是如此。
    • 非常感谢!
    • @user1290547 很高兴能帮上忙!如果您觉得它对您有用,请随时点击左侧投票按钮旁边的复选标记accept the answer。 :-) 每个帖子只能接受一个答案。
    最近更新 更多