2017-02-01 7 views
0

у меня есть данные, как показано ниже:Переформуйте долго широкие, где большинство столбцов имеют несколько значений

IDnum zipcode City   County State 
10011 36006  Billingsley Autauga AL 
10011 36022  Deatsville Autauga AL 
10011 36051  Marbury  Autauga AL 
10011 36051  Prattville Autauga AL 
10011 36066  Prattville Autauga AL 
10011 36067  Verbena  Autauga AL 
10011 36091  Selma   Autauga AL 
10011 36703  Jones   Autauga AL 
10011 36749  Plantersville Autauga AL 
10011 36758  Uriah   Autauga AL 
10011 36480  Atmore  Autauga AL 
10011 36502  Bon Secour Autauga AL 

У меня есть список Почтовых индексов, городов, которые они охватывают, и графства/заявляет, что они находятся в IDnum = числовые. значение для округа и штата, в сочетании. Список находится в формате, который вы видите сейчас, мне нужно изменить его с длинного на широкий/вертикальный на горизонтальный, где переменная IDnum становится уникальным идентификатором, а все другие возможные комбинации значений становятся широкими переменными.

IDnum zip1 city1  county1 state1 zip2 city2  county2 
10011 36006 Billingsley Autauga AL  36022 Deatsville Autauga 

Это просто образец набора данных, оно охватывает все индексы в США и включает в себя большее количество переменных. Я видел другие вопросы и ответы, подобные этому, но не там, где есть несколько значений почти в каждом столбце.

В SPSS и STATA есть команды, которые преобразуют данные таким образом, в SPSS я могу запустить команду Restructure/Cases to Vars, которая превращает 11 переменных в мой первоначальный набор данных примерно в 1750, b/c в одном графстве более 290 zips, и он реплицирует большинство других переменных 290 + раз. Это создаст много пробелов, но мне нужно, чтобы они были перестроены в один очень длинный горизонтальный файл.

Я посмотрел на reshape и reshape2, и я повесил сообщение об ошибке «по умолчанию». Я получил melt/dcast для работы sorta, но это создает одну переменную, которая является списком всех значений, а не создает переменные для каждого значения.

melted_dupes <- melt(zip_code_list_dupes, id.vars= c("IDnum")) 
HRZ_dupes <- dcast(melted_dupes, IDnum ~ variable, fun.aggregate = list) 

Я пробовал tidyr и dplyr, но потерялся в синтаксисе. Я немного удивлен, что нет данных, аналогичных встроенным командам в других пакетах, что заставляет меня предположить, что есть, и я просто не понял этого.

Любая помощь приветствуется.

ответ

1

Вы можете сделать это с помощью базовой функции reshape после добавления в последовательном подсчитывают IDnum. Предполагая, что ваши данные хранятся в data.frame имени df:

df2 <- within(df, count <- ave(rep(1,nrow(df)),df$IDnum,FUN=cumsum)) 

Обеспечивает новый столбец последовательного подсчета под названием «время». И теперь мы можем reshape в широкоэкранном формате

reshape(df2,direction="wide",idvar="IDnum",timevar="count") 
 
    IDnum zipcode.1  City.1 County.1 State.1 zipcode.2  City.2 County.2 State.2 zipcode.3 City.3 County.3 State.3 zipcode.4  City.4 County.4 State.4 
1 10011  36006 Billingsley Autauga  AL  36022 Deatsville Autauga  AL  36051 Marbury Autauga  AL  36051 Prattville Autauga  AL 

(выход усекается, проходит весь путь к zipcode.12 и т.д.)

+0

Спасибо! Как это получить в кадре данных? Я использую RStudio, и результат показывает мне имена переменных, которые я ожидал увидеть, но все это на консоли, и я смотрю на DataPane, и он все еще говорит 43, xxxx obs из 12 переменных, а не 3, xxx obs из 1750 переменных. Я что-то упускаю? Как я могу получить результат, который действительно отображается в кадре данных, чтобы я мог его просматривать, а не просто в консоли? Я также хотел создать последовательный счет var, так что спасибо за это. –

0

Возможно, существует более эффективный способ, но попробуйте следующее. Я использовал свой собственный (пример) набор данных, очень похожий на ваш. Запустите процесс шаг за шагом, чтобы увидеть, как он работает, так как вам придется изменить некоторые вещи в коде.

library(dplyr) 
library(tidyr) 

# get example data 
dt = data.frame(id = c(1,1,1,2,2), 
zipcode = c(4,5,6,7,8), 
city = c("A","B","C","A","C"), 
county = c("A","B","C","A","C"), 
state = c("A","B","C","A","C")) 

dt 

# id zipcode city county state 
# 1 1  4 A  A  A 
# 2 1  5 B  B  B 
# 3 1  6 C  C  C 
# 4 2  7 A  A  A 
# 5 2  8 C  C  C 


# get maximum number of rows for a single id 
# this will help you get the wide format 
max_num_rows = max((dt %>% count(id))$n) 

# get names of columns to reshape 
col_names = names(dt)[-1] 

dt %>% 
group_by(id) %>% 
mutate(nrow = paste0("row",row_number())) %>% 
unite_("V",col_names) %>% 
spread(nrow, V) %>% 
unite("z",matches("row")) %>% 
separate(z, paste0(col_names, sort(rep(1:max_num_rows, ncol(dt)-1))), convert=T) %>% 
ungroup() 

# # A tibble: 2 × 13 
#  id zipcode1 city1 county1 state1 zipcode2 city2 county2 state2 zipcode3 city3 county3 state3 
# * <dbl> <int> <chr> <chr> <chr> <int> <chr> <chr> <chr> <int> <chr> <chr> <chr> 
# 1  1  4  A  A  A  5  B  B  B  6  C  C  C 
# 2  2  7  A  A  A  8  C  C  C  NA <NA> <NA> <NA> 

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

  • Нет связанных вопросов^_^