首页 > 解决方案 > 关系和条件数据编码

问题描述

我有一个从 1990 年到 2016 年列出的每个州的数据集(每个州 27 个观察值,对于 50 个州,是 1350 个观察值)。在数据集中,我有state, year, pass(通过一些法律)和一个州列表neighbors。数据看起来像这样...

> head(data)
    state year pass                             neighbors
1 Alabama 1990    0 Mississippi,Tennessee,Georgia,Florida
2 Alabama 1991    0 Mississippi,Tennessee,Georgia,Florida
3 Alabama 1992    0 Mississippi,Tennessee,Georgia,Florida
4 Alabama 1993    0 Mississippi,Tennessee,Georgia,Florida
5 Alabama 1994    0 Mississippi,Tennessee,Georgia,Florida
6 Alabama 1995    0 Mississippi,Tennessee,Georgia,Florida

我试图弄清楚如何执行以下操作:

例如,state对于year第 1 行(阿拉巴马州,1990 年),查看该行的邻居列表(每个项目)并在同一年的状态向量中查找该项目(状态),看看它们是否通过那个法律pass==1。如果是这样,请创建一个neighbor_passed评估为的新变量1

例如,它会迭代,在 1990 年寻找密西西比州以查看是否pass == 1,然后在 1990 年寻找田纳西州以查看是否pass==1。它会为每一行执行此操作,匹配该year行,以搜索同一年pass==1的任何州。neighbors

这是我到目前为止所尝试的:

f<-function(x){
  x[5]<-0
  for(row in 1:dim(x)[1]){
    ego_state <- x[row,1]
    ego_year <- x[row,2]
    alter_list <- x[row,4]
    alter_list <- as.character(unlist(alter_list))
    neighbors <- unlist(strsplit(alter_list, "[,]"))
    for(i in neighbors){
      year <- ego_year
      print(paste(i,year))
      #if(x[1]==i && x[2]==year && x[3]==1){
        #x[5]<-1
      #}
    }
  }
}

正如您在我评论的内容中看到的那样,我希望该函数在 ego 的同一年(例如 1990 年)通过列/变量states查找neighbors(例如密西西比州)中的项目,转到该行(其中state== 密西西比州和year== 1990),并检查是否pass== 1。如果是这样,我想创建另一个变量(例如neighbor_passed),其中输入1的值。对于所有其他人,输入 0。然后继续对所有 i in neighbors、 peryear进行迭代,并继续对数据集中的每一行进行迭代。

标签: rdplyrrelational-database

解决方案


干得好!

data$neighbor_passed<-unlist(lapply(1:length(data$state), 
       function(j) {neighbors_j<-unlist(strsplit(as.character(data$neighbors[j]),","));
          sum(unlist(lapply(neighbors_j,function(x) data$pass[data$year==data[j,]$year & data$state==x])))>0}))

推荐阅读