注册在R中的Panel数据集中观察到个人的所有年份:

时间:2017-06-13 16:18:14

标签: r

我想确定在哪一年观察面板数据集中的个体并将信息注册到另一个变量中。 可以在连续几年中观察到个体,或者在一年或多年的间隙中观察到个体,随后可以进行连续的年度观察。

例如,在2000年和2001年观察到以下df中的ID 1,而在2000年和2002年观察到ID 2,2001年存在差距。

  

df = data.table(Year = c(2000,2000,2001,2001,2002,2002),ID = c(1,2,1,3,2,3),V1 = rep(&#34 ;",6))

DF

年| ID | V1

2000 | 1 |

2000 | 2 |

2001 | 1 |

2001 | 3 |

2002 | 2 |

2002 | 3 |

我希望V1中的outpout然后为每个ID包含观察年份的链:

年| ID | V1

2000 | 1 | 00/01

2000 | 2 | 00/02

2001 | 1 | 00/01

2001 | 3 | 01/02

2002 | 2 | 00/02

2002 | 3 | 01/02

或者更好,因为信息对于ID的每个单独观察都不重要:观察年份的信息仅针对每个ID的第一次观察。

年| ID | V1

2000 | 1 | 00/01

2000 | 2 | 00/02

2001 | 1 |

2001 | 3 | 01/02

2002 | 2 |

2002 | 3 |

感谢任何提示!

1 个答案:

答案 0 :(得分:0)

以下是使用bypaste函数的方法。我们创建一个汇总表,然后将其合并回原始表。我已经离开了全年的价值(而不是子字符串),但如果需要,可以轻松完成。

df2 <- stack(by(df, df$ID, function(d) paste(d$Year, collapse = '/')),
             stringsAsFactors = FALSE)
df2$ind <- as.numeric(as.character(df2$ind)) #convert back to numeric
merge(df, df2, by.x = 'ID', by.y = 'ind')

   ID Year V1    values
1:  1 2000    2000/2001
2:  1 2001    2000/2001
3:  2 2000    2000/2002
4:  2 2002    2000/2002
5:  3 2001    2001/2002
6:  3 2002    2001/2002

要为ID的第一次观察获得一个值,我们可以使用 dplyr 包:

library(dplyr)
merge(df, df2, by.x = 'ID', by.y = 'ind') %>%
    select(-V1) %>%
    group_by(ID) %>%
    mutate(values = ifelse(Year == min(Year), values, ''))

     ID  Year    values
  <dbl> <dbl>     <chr>
1     1  2000 2000/2001
2     2  2000 2000/2002
3     1  2001          
4     3  2001 2001/2002
5     2  2002          
6     3  2002