如何在R中将事件数据重构为二元数据



我的数据如下:

ID  Year 
1   1990
2   1990
3   1991
4   1992
5   1995

我想在每个观察中添加六个国家(比如说国家A、B、C、D、E、F(。我总共有30条意见。所以我希望数据是这样的:

ID  Year    Country
1    1990     A
1    1990     B
1    1990     C
1    1990     D
1    1990     E
1    1990     F
2    1990     A
2    1990     B
2    1990     C
2    1990     D
2    1990     E
2    1990     F
3    1991     A
3    1991     B
3    1991     C
3    1991     D
3    1991     E
3    1991     F
4    1992     A
4    1992     B
4    1992     C
4    1992     D
4    1992     E
4    1992     F
5    1995     A
5    1995     B
5    1995     C
5    1995     D
5    1995     E
5    1995     F

基本R:

countries <- LETTERS[1:6] # whatever you really have as a vector
out <- merge(dat, data.frame(Country = countries), by = NULL)
out[c(1:3, 28:30),]
#    ID Year Country
# 1   1 1990       A
# 2   2 1990       A
# 3   3 1991       A
# 28  3 1991       F
# 29  4 1992       F
# 30  5 1995       F

注意,这适用于data.frametbl_df,但data.table::merge不允许by=NULL进行笛卡尔展开。


数据

dat <- structure(list(ID = 1:5, Year = c(1990L, 1990L, 1991L, 1992L, 1995L)), class = "data.frame", row.names = c(NA, -5L))

我们可以使用crossing

library(tidyr)
crossing(df1, Country = LETTERS[1:6])

-输出

# A tibble: 30 × 3
ID  Year Country
<int> <int> <chr>  
1     1  1990 A      
2     1  1990 B      
3     1  1990 C      
4     1  1990 D      
5     1  1990 E      
6     1  1990 F      
7     2  1990 A      
8     2  1990 B      
9     2  1990 C      
10     2  1990 D      
# … with 20 more rows

或使用base Rrep

out <- cbind(df1[rep(seq_len(nrow(df1)), each = 6),], Country = LETTERS[1:6])

数据

df1 <- structure(list(ID = 1:5, Year = c(1990L, 1990L, 1991L, 1992L, 
1995L)), class = "data.frame", row.names = c(NA, -5L))

最新更新