1

我正在尝试将我的数据从展览 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      
4

1 回答 1

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)

重塑2

如果您正在寻找“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
于 2013-02-06T18:49:01.220 回答