Создайте матрицу фиктивных переменных из моего фрейма данных; используйте `NA` для пропущенных значений

#r #matrix #dummy-variable

#r #матрица #фиктивная переменная

Вопрос:

У меня есть данные, основанные на разных годах, повторяющиеся несколько раз. Я хочу, чтобы мои выходные данные имели столбцы, равные количеству лет, каждый столбец в течение одного года. Теперь цель состоит в том, чтобы создать фиктивные переменные для каждого года отдельно. Например, выходной столбец для 2000 года должен иметь значение «1» всякий раз, когда в основных данных есть наблюдение, отличное от NA, параллельное 2000 году, иначе «0». Более того, NA должен оставаться NA. Пожалуйста, смотрите Ниже небольшой пример входных данных:

 df:
2000    NA
2001    NA
2002   -1.3
2000    1.1
2001    0
2002    NA
2000   -3
2001    3
2002    4.1
  

Теперь вывод должен быть:

 df1:
2000    2001    2002
 NA      NA      NA
 NA      NA      NA
 0       0       1
 1       0       0
 0       1       0
 NA      NA      NA
 1       0       0
 0       1       0
 0       0       1
  

Я бы предпочел получить этот результат, используя «цикл for», если это возможно. В противном случае будет оценен любой более простой подход.

Ответ №1:

Цикл не требуется. Мы можем использовать model.matrix :

 ## your data variable and NA index
x <- c(NA, NA, -1.3, 1.1, 0, NA, -3, 3, 4.1)
na_id <- is.na(x)

## code your year variable as a factor
year <- factor(rep(2000:2002, 3))

## original model matrix; drop intercept to disable contrast
X <- model.matrix(~ year - 1)

#  year2000 year2001 year2002
#1        1        0        0
#2        0        1        0
#3        0        0        1
#4        1        0        0
#5        0        1        0
#6        0        0        1
#7        1        0        0
#8        0        1        0
#9        0        0        1

## put NA where `x` is NA (we have used recycling rule here)
X[na_id] <- NA

#  year2000 year2001 year2002
#1       NA       NA       NA
#2       NA       NA       NA
#3        0        0        1
#4        1        0        0
#5        0        1        0
#6       NA       NA       NA
#7        1        0        0
#8        0        1        0
#9        0        0        1
  

Матрица X будет иметь некоторые атрибуты. Вы можете удалить их, если хотите:

 attr(X, "assign") <- attr(X, "contrasts") <- NULL
  

Вы также можете переименовать имена столбцов этой матрицы во что-то другое, например

 colnames(X) <- 2000:2002
  

Комментарии:

1. Спасибо @Zheyuan. Но это применимо, когда годы повторяются последовательно и равное количество раз. Как насчет ситуации, когда 2000 год встречается трижды, затем дважды 2001 год, а затем в конце 2002 год повторяется трижды. В этом случае, как я могу изменить этот код?

2. Спасибо. Это действительно полезно.