2016-10-01 2 views
2

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

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

ответ

3

Никакой цикл не требуется. Мы можем использовать 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 

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

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

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

colnames(X) <- 2000:2002 
+0

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

+1

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

Смежные вопросы