#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. Спасибо. Это действительно полезно.