使用R将长数据集转换为宽数据集

时间:2014-08-22 11:51:50

标签: r reshape2

我非常感谢在以下情况下使用R代码的一些帮助:

这是数据集的前11行:

Sa1_main11  Sa1_main11_2
20401106101 20401106101 -
20401106101 21105128609 -
20401106101 21105128653
20601110501 20601110501
20601110501 20601110530
20601110501 20601110531
20601110501 20601110532
20601110501 20601110533
20601110501 20601110534
20601110501 20601110614
20601110502 20601110502

SA1是澳大利亚统计局使用的地理单位。

此文件是SA1连续的列表 - 第1列是基本SA1,第二列是与第一个SA1相邻的SA1。

例如,取前3行

  • 20401106101毗邻
  • 21105128609 adjoins 20401106101
  • 21105128653 adjoins 20401106101

我需要做的是制作一个数据集,其中第一行的格式为

20401106101  21105128609  21105128653

我已经尝试了reshape2包,但缺少行标签(这些都是相同的)会让我觉得不可能。

编辑 - 这是指向数据的链接

https://www.dropbox.com/s/tigqdevybskm1bs/Original.JPG

这里是前三行应该是什么样子的链接

https://www.dropbox.com/s/b2l36mry9ibfnfq/Destination.JPG

2 个答案:

答案 0 :(得分:0)

看起来split可能会对您有所帮助:

split(DF[,2], DF[,1]) 

#$`20401106101`
#[1] 20401106101 21105128609 21105128653
#
#$`20601110501`
#[1] 20601110501 20601110530 20601110531 20601110532 20601110533 20601110534 20601110614
#
#$`20601110502`
#[1] 20601110502

目前还不清楚您打算如何处理这些数据。 data.frames和matrices都不能包含不同长度的行。因此复制确切的结果有点复杂(并且不是很有用)。无论如何,这将会接近:

res <- split(DF[,2], DF[,1]) 
res <- lapply(res, function(x) {
  length(x) <- max(sapply(res, length))
  x
  })

do.call(rbind, res)
#                   [,1]        [,2]        [,3]        [,4]        [,5]        [,6]        #[,7]
#20401106101 20401106101 21105128609 21105128653          NA          NA          NA          NA
#20601110501 20601110501 20601110530 20601110531 20601110532 20601110533 20601110534 20601110614
#20601110502 20601110502          NA          NA          NA          NA          NA          NA

答案 1 :(得分:0)

检查是否有效:( dat是数据集)

 library(reshape2)
 dat$indx <- with(dat, ave(seq_along(Sa1_main11), Sa1_main11, FUN=seq_along))
 dcast(dat, Sa1_main11~indx, value.var="Sa1_main11_2")
 #     Sa1_main11           1           2           3           4           5
 #1 20401106101 20401106101 21105128609 21105128653          NA          NA
 #2 20601110501 20601110501 20601110530 20601110531 20601110532 20601110533
 #3 20601110502 20601110502          NA          NA          NA          NA
 #           6           7
 #1          NA          NA
 #2 20601110534 20601110614
 #3          NA          NA