我想确定在哪一年观察面板数据集中的个体并将信息注册到另一个变量中。 可以在连续几年中观察到个体,或者在一年或多年的间隙中观察到个体,随后可以进行连续的年度观察。
例如,在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 |
感谢任何提示!
答案 0 :(得分:0)
以下是使用by
和paste
函数的方法。我们创建一个汇总表,然后将其合并回原始表。我已经离开了全年的价值(而不是子字符串),但如果需要,可以轻松完成。
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