реляционное и условное кодирование данных - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть набор данных с каждым состоянием, перечисленным с 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
      #}
    }
  }
}

Как вы можете видеть из того, что я прокомментировал, я хочу, чтобы функция просматривала столбец / переменную states, чтобы найти элемент в neighbors (например, Миссисипи) в том же самом эго.год (например, 1990), перейдите в строку ТО (где state == Миссисипи и year == 1990) и проверьте, если pass == 1. Если это так, я хотел бы создать другую переменную(например, neighbor_passed), где вводится значение 1.Для всех остальных 0 - это ввод.Затем продолжите итерацию для всех i в neighbors, на year и продолжите итерацию для каждой строки в наборе данных.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Вот, пожалуйста!

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}))
0 голосов
/ 20 февраля 2019

Если я правильно понял ваш вопрос.

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