将10年的长格式样带数据转换为宽幅格式

时间:2014-10-09 20:47:01

标签: r

尽管有很多关于长格式数据转换为宽格式版本的信息,但我仍然难以理解如何在未标记的框架中设置我的数据集以进行分析。我有每年 - 县组合重复的20行横断面数据,我没有看到以前的帖子占这种格式。

基本上,我试图从这样的格式中获取:

A   B   C   D
a   q   1   0
a   q   0   1
a   q   2   0
a   q   4   0
b   v   0   2
b   v   3   1
b   v   0   0

采用以下格式:

A   B   C.1 C.2 C.3 C.4 D.1 D.2 D.3 D.4
a   q   1   0   2   4   0   1   0   0
b   v   0   3   3   0   2   1   4   0

我知道它可能需要融合()和cast()的一些组合,但是我无法弄清楚的是如何使进程循环一定数量的行(上例中为4,20 in我的真实数据。)

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

我认为原始数据集中不存在的关键信息是每个单独测量的观察数(我将调用此变量time)。如果没有这个,你就不会拥有每一行的唯一标识符,而重塑工具也不会像你想要的那样工作。添加后,您可以使用任何您想要的重塑工具来获得所需的格式。

基于此数据集(根据您所需的输出添加额外的行)

  A B C D
1 a q 1 0
2 a q 0 1
3 a q 2 0
4 a q 4 0
5 b v 0 2
6 b v 3 1
7 b v 3 4
8 b v 0 0

首先要为每个A / B组合添加时间变量。我正在使用 dplyr 函数按组添加时间变量。这假定数据集已经按观察顺序排列。然后重塑,来自 reshape2 meltdcast

library(reshape2)
library(dplyr)

dat %>%
    group_by(A, B) %>%
    mutate(time = 1:n()) %>%
    melt(id.vars = c("A", "B", "time")) %>%
    dcast(A + B ~ variable + time)

这是添加time变量后原始数据集的外观:

Source: local data frame [8 x 5]
Groups: A, B

  A B C D time
1 a q 1 0    1
2 a q 0 1    2
3 a q 2 0    3
4 a q 4 0    4
5 b v 0 2    1
6 b v 3 1    2
7 b v 3 4    3
8 b v 0 0    4

重塑后的最终输出:

  A B C_1 C_2 C_3 C_4 D_1 D_2 D_3 D_4
1 a q   1   0   2   4   0   1   0   0
2 b v   0   3   3   0   2   1   4   0

这可以通过 tidyr 中的gatherspread来完成,但我花了一个额外的步骤将time与C& D组unite

library(tidyr)
library(dplyr)

dat %>%
group_by(A, B) %>%
mutate(time = 1:n()) %>%
gather(name, value, C:D) %>%
unite(Name, name, time, sep = ".", remove = TRUE) %>%
spread(Name, value)

  A B C.1 C.2 C.3 C.4 D.1 D.2 D.3 D.4
1 a q   1   0   2   4   0   1   0   0
2 b v   0   3   3   0   2   1   4   0