r - 使用 R 创建起点-终点矩阵

标签 r o-d-matrix

我的数据框由个人和他们在某个时间点居住的城市组成。我想为每年生成一个起点-终点矩阵,记录从一个城市到另一个城市的移动次数。我想知道:

  • 如何自动生成数据集中每一年的起点-终点表?
  • 如何以相同的 5x5 格式生成所有表格,5 是我示例中的城市数量?
  • 有没有比我在下面提出的更有效的代码?我打算在一个非常大的数据集上运行它。

  • 考虑以下示例:
    #An example dataframe
    id=sample(1:5,50,T)
    year=sample(2005:2010,50,T)
    city=sample(paste(rep("City",5),1:5,sep=""),50,T)
    df=as.data.frame(cbind(id,year,city),stringsAsFactors=F)
    df$year=as.numeric(df$year)
    df=df[order(df$id,df$year),]
    rm(id,year,city)
    

    我最好的尝试
    #Creating variables
    for(i in 1:length(df$id)){
      df$origin[i]=df$city[i]
      df$destination[i]=df$city[i+1]
      df$move[i]=ifelse(df$orig[i]!=df$dest[i] & df$id[i]==df$id[i+1],1,0) #Checking whether a move has taken place and whether its the same person
      df$year_move[i]=ceiling((df$year[i]+df$year[i+1])/2) #I consider that the person has moved exactly between the two dates at which its location was recorded
    }
    df=df[df$move!=0,c("origin","destination","year_move")]    
    

    创建 2007 年的起点-终点表
    yr07=df[df$year_move==2007,]
    table(yr07$origin,yr07$destination)
    

    结果
            City1 City2 City3 City5
      City1     0     0     1     2
      City2     2     0     0     0
      City5     1     1     0     0
    

    最佳答案

    您可以按 id 拆分数据,对特定于 id 的数据框执行必要的计算以获取该人的所有 Action ,然后重新组合:

    spl <- split(df, df$id)
    move.spl <- lapply(spl, function(x) {
      ret <- data.frame(from=head(x$city, -1), to=tail(x$city, -1),
                        year=ceiling((head(x$year, -1)+tail(x$year, -1))/2),
                        stringsAsFactors=FALSE)
      ret[ret$from != ret$to,]
    })
    (moves <- do.call(rbind, move.spl))
    #       from    to year
    # 1.1  City4 City2 2007
    # 1.2  City2 City1 2008
    # 1.3  City1 City5 2009
    # 1.4  City5 City4 2009
    # 1.5  City4 City2 2009
    # ...
    

    因为此代码对每个 id 使用矢量化计算,所以它应该比在提供的代码中循环遍历数据帧的每一行要快得多。

    现在您可以使用 split 获取特定年份的 5x5 移动矩阵和 table :
    moves$from <- factor(moves$from)
    moves$to <- factor(moves$to)
    lapply(split(moves, moves$year), function(x) table(x$from, x$to))
    # $`2005`
    #        
    #         City1 City2 City3 City4 City5
    #   City1     0     0     0     0     1
    #   City2     0     0     0     0     0
    #   City3     0     0     0     0     0
    #   City4     0     0     0     0     0
    #   City5     0     0     1     0     0
    # 
    # $`2006`
    #        
    #         City1 City2 City3 City4 City5
    #   City1     0     0     0     1     0
    #   City2     0     0     0     0     0
    #   City3     1     0     0     1     0
    #   City4     0     0     0     0     0
    #   City5     2     0     0     0     0
    # ...
    

    关于r - 使用 R 创建起点-终点矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30263023/

    相关文章:

    r - 如何在 data.table 中使用 OR 条件连接表

    r - 运行简单的 rhadoop 作业时出现问题 - 管道损坏错误

    r - 如何合并数字列?

    r - 如何在 R 中对列联表重新排序以形成混淆矩阵

    python - 将(出发地、目的地、距离)转换为距离矩阵

    r - R和ggplot2中的分数(除以或除以)的表示法