重塑所需的帮助

时间:2013-02-06 18:25:20

标签: r reshape reshape2

我正在尝试将展览A中此表格中的数据重新整形为展览B中的表格。我已经尝试过对每三列数据进行整形和循环并附加数据集,但无法完全实现。我怎样才能重塑这个?

A   AFG1    AFG2    AFG3    US1 US2 US3 t
    5   7   9   3   4   5   1980
    6   8   10  4   6   5   2000


B   1   2   3   t   xtry        
    5   7   9   1980    AFG     
    6   8   10  2000    AFG     
    3   4   5   1980    US      
    4   6   5   2000    US      

1 个答案:

答案 0 :(得分:4)

假设您的data.frame被称为“mydf”,请尝试:

reshape(mydf, direction = "long",
        idvar = "t",
        varying = 1:6,
        v.names = c("1", "2", "3"), 
        times = c("AFG", "US"),
        timevar = "xtry")
#             t xtry 1 2  3
# 1980.AFG 1980  AFG 5 7  9
# 2000.AFG 2000  AFG 6 8 10
# 1980.US  1980   US 3 4  5
# 2000.US  2000   US 4 6  5

对于你的问题,你的参数必须比直截了当的reshape问题更冗长,因为你的变量的命名与R期望的不同(以1.AFG的形式, 2.AFG,等等。)

例如:

mydf2 <- mydf
names(mydf2) <- gsub("([A-Z]+)([0-9]+)", "\\2\\.\\1", names(mydf2))

如果您的名字如下所示:

names(mydf2)
# [1] "1.AFG" "2.AFG" "3.AFG" "1.US"  "2.US"  "3.US"  "t" 

reshape命令更直接。

reshape(mydf2, direction = "long", idvar = "t",
        timevar = "xtry", varying = 1:6)

reshape2

如果你正在寻找一个“reshape2”解决方案,我实际上发现它比使用基础R的reshape函数(通常是另一种方式)更多的工作。这就是我想出的:

首先,melt数据集。

library(reshape2)
mydf_m <- melt(mydf, id.vars="t")
head(mydf_m)
#      t variable value
# 1 1980     AFG1     5
# 2 2000     AFG1     6
# 3 1980     AFG2     7
# 4 2000     AFG2     8
# 5 1980     AFG3     9
# 6 2000     AFG3    10

“变量”列对我们目前的形式来说是无用的,所以让我们解决它。

mydf_m <- cbind(mydf_m, 
                colsplit(gsub("([A-Z]+)([0-9]+)", 
                              "\\1_\\2", mydf_m$variable), 
                         "_", c("xtry", "var")))

以下是现在数据的样子。

head(mydf_m)
#      t variable value xtry var
# 1 1980     AFG1     5  AFG   1
# 2 2000     AFG1     6  AFG   1
# 3 1980     AFG2     7  AFG   2
# 4 2000     AFG2     8  AFG   2
# 5 1980     AFG3     9  AFG   3
# 6 2000     AFG3    10  AFG   3

现在很简单。

dcast(mydf_m, t + xtry ~ var)
#      t xtry 1 2  3
# 1 1980  AFG 5 7  9
# 2 1980   US 3 4  5
# 3 2000  AFG 6 8 10
# 4 2000   US 4 6  5