2017-02-01 33 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 

这只是数据集的示例,它包含了美国的每个zip文件,并包含更多变量。我已经看到类似于这个问题的其他问题和答案,但不是几乎每列都有多个值的地方。

SPSS和STATA中有命令可以这种方式重新塑造数据,在SPSS中我可以运行一个Restructuring/Cases to Vars命令,将我的初始数据集中的11个变量转换为1750年左右,一个县有290多个变量拉链,它复制大部分其他变量290+次。这将创造许多空白,但我需要将其重新塑造成一个非常长的水平文件。

我看了看reshape和reshape2,并挂上了'默认长度'错误消息。我确实得到了融合/预测来分类工作,但是这会创建一个变量,它是所有值的列表,而不是为每个值创建变量。

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

我试过tidyr和dplyr,但在语法上迷了路。有点惊讶,没有一个命令类似于其他包中的命令内置的数据,让我假设有,而我只是没有弄明白。

任何帮助表示赞赏。

回答

1

您可以通过IDnum在连续数增加后,与基础功能reshape做到这一点。假设你的数据存储在一个名为dfdata.frame

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,结果显示了我期望看到的varname,但全部都在控制台中,我查看了DataPane,它仍然显示43,包含12个变量的xxxx obs,而不是3,xxx obs 1750个变量。我错过了什么吗?如何让结果真正显示在数据框中,以便我可以查看它,而不仅仅是在控制台中? 我也在创建一个顺序计数变量,所以也非常感谢你。 –

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>