从邻接矩阵重建二进位数据帧的最有效过程是什么?

时间:2019-06-07 21:01:39

标签: r dataframe data-cleaning adjacency-matrix

对于我认为这是一个非常简单的问题,我深表歉意。不幸的是,尽管我在这里的搜索返回了许多从二进数据帧中建立邻接矩阵的结果,但我却没有遇到相反的过程-从邻接矩阵创建二进数据帧。

这是我在R中使用的xls文件的子集:

ccode           2       20      31     40      41      42   
    year        2010    2010    2010   2010    2010    2010 
        abbrev  USA     CAN     BHM    CUB     HAI     DOM  
2   2010    USA 0       1       1      1       1       1    
20  2010    CAN 1       0       0      1       1       1    
31  2010    BHM 1       1       0      1       1       0    
40  2010    CUB 1       1       1      0       1       1    
41  2010    HAI 1       1       1      1       0       1    
42  2010    DOM 1       1       0      1       1       0    
51  2010    JAM 1       1       0      1       0       0    

我希望它看起来像这样:

ccode   ccode2  year    Value       
2       20      2010    1   
2       31      2010    1
2       40      2010    1        
...    
20      31      2010    0     
20      40      2010    1 
20      41      2010    1       
...       

执行这种转换需要哪些R程序包/代码?

对于那些希望访问全部数据的用户,它是DIPCON 3.0数据库,可以在这里找到:https://www.volgy.org/projects-and-data

1 个答案:

答案 0 :(得分:0)

path = "DIPCON_3.0.xlsx"# Put the correct path to your file
library(readxl) 
sheets = excel_sheets(path)

my_read = function(x){
  dat = read_excel(path,x)
  c_names = 1:4# The column names-also same as the row names
  col_names = do.call(paste,data.frame(t(dat[c_names,-c_names])))
  row_names = do.call(paste,dat[-c_names,c_names])
  dat1 = as.table(matrix(as.numeric(unlist(dat[-c_names,-c_names])),
                nrow(dat)-4,dim=list(row_names,col_names)))
  d = data.frame(dat1)
  l = nrow(d)
  proto = data.frame(ccode=numeric(l),Year=numeric(l),C1=character(l),C2=character(l))
  m = do.call(cbind,lapply(d[2:1],function(x) strcapture("(\\d+) (\\d+) (\\w+) (\\w+)",x,proto)))
  cbind(m,d[3])
}

my_read(sheets[1])