R 将10年的长格式横断面数据转换为宽格式

R 将10年的长格式横断面数据转换为宽格式,r,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

尽管有很多关于将长格式数据转换为宽格式版本的信息,但我仍然对如何在未标记的框架中设置数据集进行分析感到困惑。我有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
以这样的格式:

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
我知道这可能需要melt()和cast()的一些组合,但我不知道如何让流程在一定数量的行上循环(上例中为4行,实际数据中为20行)


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

我认为原始数据集中没有的关键信息是每个单独测量的观测值(我将此变量称为
time
)。如果没有这些,您就没有每一行的唯一标识符,并且重塑工具也无法按照您所希望的方式工作。一旦你添加了它,你就可以使用任何你想要的重塑工具来获得你想要的格式

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

首先要做的是为每个
a
/
B
组合添加一个时间变量。我正在使用dplyr函数按组添加时间变量。这假设数据集已按观察顺序排列。然后重塑,在这里使用
melt
dcast
重塑2开始

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开始的
collect
spread
已经完成了这项工作,但我花了额外的一步将
time
与具有
unite
的C&D小组结合起来

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

目前还不清楚示例输入如何转换为所需的输出。你能花点时间修复你的例子,这样我们就可以验证我们的代码吗?正如BondedDust所说,很难准确地说出你想要的是什么。这段代码让我尽可能接近您所展示的内容:
Testmelt,或者实际上数据有8行?是否应在第7行中插入A、b、C、D列的“b v 3 4”?这纯粹是猜测。