Я работаю с грязным файлом избирателя. Рассмотрим следующее tibble
:
library(dplyr)
library(tidyr)
dat <- tibble(
id = factor(c("A","B","C","D","E")),
demographic_info1 = round(rnorm(5),2),
demographic_info2 = round(rnorm(5),2),
election_1 = c(NA,"GN2016","GN2016","SE2016","GN2008"),
election_2 = c(NA,"MT2014","GN2012","GN2016","GN2004"),
election_3 = c(NA,NA,NA,"MT2014","GN2000"),
election_4 = c(NA,NA,NA,"GN2012",NA),
election_5 = c(NA,NA,NA,"MT2010",NA),
)
Что выглядит так:
# A tibble: 5 x 8
id demographic_info1 demographic_info2 election_1 election_2 election_3 election_4 election_5
<fctr> <dbl> <dbl> <chr> <chr> <chr> <chr> <chr>
1 A -1.50 0.81 <NA> <NA> <NA> <NA> <NA>
2 B -1.84 -0.64 GN2016 MT2014 <NA> <NA> <NA>
3 C 1.66 -0.10 GN2016 GN2012 <NA> <NA> <NA>
4 D 0.91 -0.08 SE2016 GN2016 MT2014 GN2012 MT2010
5 E 0.04 -1.15 GN2008 GN2004 GN2000 <NA> <NA>
- Каждый
id
является уникальным идентификатором избирателя. - Два столбца
demographic_info
являются заполнителями, просто чтобы продемонстрировать, что я хочу сохранить эти значения при изменении формы данных.
Меня интересуют столбцы с election_1
по election_5
. Данные структурированы таким образом, что файл включает последние 5 выборов, в которых кто-то участвовал. election_1
— самые последние, election_5
— самые недавние.
Обратите внимание, что человек A
никогда не приходил голосовать, в то время как человек D
всегда делает это. Что я хотел бы сделать, так это превратить эти столбцы в ряд переменных: SE2016
, GN2016
, MT2014
, GN2012
и т. д.; то есть все значения в диапазоне от election_1
до election_5
. Я хотел бы, чтобы каждая из этих переменных была либо TRUE
, либо FALSE
для того, явился ли этот человек на опросы. Я пробовал этот код:
dat %>% # take data
gather(election, race, election_1:election_5) %>% # gather by election
mutate(temp=TRUE) %>% # make new variable that is all TRUE
select(-election) %>% # drop election variable
spread(race, temp, fill=FALSE) # spread by this all TRUE variable, fill all NAs as FALSE
Однако spread
выдает ошибку:
Error: Duplicate identifiers for rows (1, 6, 11, 16, 21), (12, 17, 22), (13, 18, 23), (20, 25)
Это связано с тем, что для каждого значения переменной race
имеется несколько записей. Я пытался выполнить group_by(id)
перед выполнением spread
, но выдается та же ошибка.
Я бы хотел, чтобы полученный tibble
выглядел так:
# A tibble: 5 x 11
id demographic_info1 demographic_info2 SE2016 GN2016 MT2014 GN2012 MT2010 GN2008 GN2004 GN2000
<fctr> <dbl> <dbl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl> <lgl>
1 A -0.91 -0.56 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
2 B 1.24 -1.78 FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE
3 C 0.61 0.11 FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE
4 D 2.43 -0.53 TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE
5 E -1.40 -1.23 FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
spread
- person akrun   schedule 19.08.2017id
не считается столбцом последовательности? Не уверен, что следую. - person Mark White   schedule 19.08.2017