【问题标题】:convert long dataset to wide dataset using R使用 R 将长数据集转换为宽数据集
【发布时间】:2014-08-22 11:51:50
【问题描述】:

如果在以下情况下使用 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 毗邻 20401106101
  • 21105128653 毗邻 20401106101

我需要做的是生成一个数据集,其中第一行的格式是

20401106101  21105128609  21105128653

我尝试过 reshape2 包,但缺少行标签(它们都是相同的)使我无法做到。

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

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

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

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

【问题讨论】:

  • 我不确定想要的结果是什么。也许table(DF)
  • 如果您可以根据样本数据提供完整的所需输出,这将非常有帮助。
  • 现在包含指向更大的原始图片和输出示例的链接。还尝试了 table() - 它产生一个非常大的矩阵,每个 SA1 作为行和列,每个单元格中看起来像一个零。
  • 请不要在问题中包含数据截图。将数据复制到问题中并格式化。

标签: r reshape2


【解决方案1】:

检查这是否有效:(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

【讨论】:

  • 感谢 Roland 和 akrun 的帮助。两种解决方案都产生了相同的输出; akrun 的解决方案运行起来要快得多(尽管输入数据集中只有 69k 行,但这对我来说不是什么大问题。我不得不在 excel 中修改这两个解决方案的输出以删除 NA,但我没有'还没有测试这对我来说是否会成为一个问题。
【解决方案2】:

看起来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 和矩阵都不能容纳不同长度的行。所以复制确切的结果有点复杂(而且不是很有用)。无论如何,这将接近:

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

【讨论】:

  • 关于不同长度行的注释;输出文件将与 HLM 软件一起使用。我将做一个具有两个级别的分层线性模型,其中包括邻接约束。 HLM 软件要求具有连续性数据的文件采用这种格式。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 2020-08-11
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2020-09-05
相关资源
最近更新 更多