генерировать переменную в соответствии со сдвигом времени другой переменной в r - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть такой фрейм данных

year  id  employment    
1998  1   0
2000  1   0
2002  1   0
2004  1   0 
1998  2   0
2000  2   0
2002  2   1
2004  2   1
1998  3   0
2000  3   1
2002  3   1
2004  3   1

Я хотел бы создать новую переменную «заклинание», которая указывает, в какой момент времени каждый человек переходит от безработного (занятость = 0) к занятому (занятость = 1) статусу. Другими словами, я хочу что-то такого вида

year  id  employment   spell 
    1998  1   0            0
    2000  1   0            0
    2002  1   0            0
    2004  1   0            0
    1998  2   0            3
    2000  2   0            3
    2002  2   1            3
    2004  2   1            3
    1998  3   0            2
    2000  3   1            2
    2002  3   1            2
    2004  3   1            2

Как видите, индивидуум 1 показывает значение 0 для переменной «заклинание», поскольку он не находит работу (переменная занятость остается равной нулю для всех связанных с ним наблюдений). С другой стороны, индивидуум 2 показывает заклинание, равное 3, поскольку он находит работу в третьем наблюдении (год = 2002), а индивид 3 - во втором (год = 2000). У кого-нибудь есть предложения сделать что-то подобное? Большое вам спасибо за ваше время.

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Вот вариант base R

transform(DF, spell = ave(
  employment,
  id,
  FUN = function(x)
    ifelse(all(x == 0), 0, which(cumsum(x) == 1))
))
#   year id employment spell
#1  1998  1          0     0
#2  2000  1          0     0
#3  2002  1          0     0
#4  2004  1          0     0
#5  1998  2          0     3
#6  2000  2          0     3
#7  2002  2          1     3
#8  2004  2          1     3
#9  1998  3          0     2
#10 2000  3          1     2
#11 2002  3          1     2
#12 2004  3          1     2

Основная идея состоит в том, чтобы искать позицию первой 1 - which(cumsum(x) == 1) - на группу id. Но поскольку в группе, где id == 1, нет ни одного, нам нужно ifelse для обработки этого случая.

Данные

DF <- structure(list(year = c(1998L, 2000L, 2002L, 2004L, 1998L, 2000L, 
2002L, 2004L, 1998L, 2000L, 2002L, 2004L), id = c(1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L), employment = c(0L, 0L, 0L, 
0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 1L)), .Names = c("year", "id", 
"employment"), class = "data.frame", row.names = c(NA, -12L))
0 голосов
/ 03 сентября 2018

и еще один:)

# create data
rm(list = ls())
help = c(1998,  1,   0, 2000,  1,   0, 2002,  1,   0, 2004,  1,   0, 1998,  2,   0, 2000,  2,   0, 2002,  2,   1, 2004,  2,   1, 1998,  3,   0, 2000,  3,   1, 2002,  3,   1, 2004,  3,   1)
help = matrix(help, nrow = length(help)/3, ncol = 3, byrow = T)
data = data.frame(help)
names(data) = c("year", "id", "employment")
data

# create desired variable
help2 = tapply(data$employment, data$id , function(f) ifelse(sum(f == 1, na.rm = T) > 0, sum(f == 0, na.rm = T)+1, 0))
help2 = data.frame(help2)
help2$id = rownames(help2)
data = merge(data, help2, by = "id")
data
0 голосов
/ 03 сентября 2018

Этот фрагмент предполагает, что ваши данные находятся в df и что идентификаторы - это последовательные целые числа, начинающиеся с 1:

#assume your data is in df
df1 <- reshape(df, idvar="year", timevar="id", direction="wide")
pivoted <- subset(df1, select = -c(year))
m <- diff(as.matrix(pivoted))
m[is.na(m)] <- 0
df2 <- apply(m, 2, cummax)
df3 <- apply(df2,2, cumsum)
x <- df3[nrow(df3),]
y <- 1 + nrow(df1) - x
y[y == as.numeric(1+nrow(df1))] <- 0

# assign new column
df$spell <- y[df$id]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...