关系和条件数据编码

时间:2019-02-20 01:29:35

标签: r dplyr relational-database

我有一个从1990年到2016年列出的每个州的数据集(对于50个州,每个州的27个观测值是1350个观测值)。在数据集中,我有stateyearpass(通过某些法律)以及该州的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

我试图弄清楚如何做:

例如,将stateyear用于第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
      #}
    }
  }
}

正如您在我已注释掉的内容中所看到的,我希望该函数通过列/变量states来查找自我同一年(neighbors(例如密西西比州)中的项目(例如1990年),转到该行(其中state ==密西西比州和year == 1990年),然后检查pass ==1。如果是,我想要另一个要创建的变量(例如neighbor_passed),其中输入值为1。对于其他所有输入0。然后继续neighborsyear中所有i的迭代,并继续数据集中每一行的迭代。

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题。

library(dplyr)
data <- mutate(data, neighbor_passed =
                 ifelse(pass == 0, 0, 1))

答案 1 :(得分:0)

您在这里!

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}))