麻烦重塑 - 数据在流程中的某处被破坏

时间:2014-05-06 16:17:16

标签: r reshape2

我有以下表格的数据:

    brt_id          ADDRESS             OWNERNAME year PRINCIPAL INTEREST PENALTY OTHER        TOTAL LIEN STATUS
1 11000600 00108 WHARTON ST PRUSINOWSKI JOSEPHINE 2001         0        0       0     0     0            
2 11000600 00108 WHARTON ST PRUSINOWSKI JOSEPHINE 2002         0        0       0     0     0            
3 11000600 00108 WHARTON ST PRUSINOWSKI JOSEPHINE 2003         0        0       0     0     0            
4 11000600 00108 WHARTON ST PRUSINOWSKI JOSEPHINE 2004         0        0       0     0     0            
5 11000600 00108 WHARTON ST PRUSINOWSKI JOSEPHINE 2005         0        0       0     0     0            
6 11000600 00108 WHARTON ST PRUSINOWSKI JOSEPHINE 2006         0        0       0     0     0            

我希望“逐年”重塑它(这是我在STATA中类似练习的直觉),因此我得到PRINCIPAL_2001PRINCIPAL_2002等变量。

然而,当我跑步时:

data2m<-melt(data2, id=c("brt_id", "year"))
data2c<-dcast(data2m, brt_id+year~...)

结果数据(应与原始数据相同)如下所示:

    brt_id year ADDRESS OWNERNAME PRINCIPAL INTEREST PENALTY OTHER TOTAL LIEN STATUS
1 11000600 2001       1         1         1        1       1     1     1    1      1
2 11000600 2002       1         1         1        1       1     1     1    1      1
3 11000600 2003       1         1         1        1       1     1     1    1      1
4 11000600 2004       1         1         1        1       1     1     1    1      1
5 11000600 2005       1         1         1        1       1     1     1    1      1
6 11000600 2006       1         1         1        1       1     1     1    1      1

当我融化数据时,我收到一条警告信息:

Warning message:
attributes are not identical across measure variables; they will be dropped 

另一个我投出数据的时候:

Aggregation function missing: defaulting to length

看起来问题是在施法中发生的,因为看到融化的数据似乎很好:

            brt_id year variable      value
70000000 621506800 2005     LIEN           
70000001 621506800 2006     LIEN           
70000002 621506800 2007     LIEN           
70000003 621506800 2008     LIEN           
70000004 621506800 2009     LIEN           

如果我使用acast

,结果会相似(尽管更糟)
              ADDRESS OWNERNAME PRINCIPAL INTEREST PENALTY OTHER TOTAL LIEN STATUS
11000600_2001       1         1         1        1       1     1     1    1      1
11000600_2002       1         1         1        1       1     1     1    1      1
11000600_2003       1         1         1        1       1     1     1    1      1
11000600_2004       1         1         1        1       1     1     1    1      1
11000600_2005       1         1         1        1       1     1     1    1      1
11000600_2006       1         1         1        1       1     1     1    1      1

知道这里可能出现什么问题吗?在尝试将其恢复正常时,我也失去了一个观察,出于某种原因......

2 个答案:

答案 0 :(得分:6)

这是使用基础R reshape函数的解决方案,并应用于@ MrFlick的示例数据。这样可以避免首先melt您的数据,dcast将其放入&#34;范围内&#34;格式。

reshape(data2, direction = "wide", 
        idvar = c("brt_id", "ADDRESS", "OWNERNAME"), 
        timevar = "year")

现在,关于你的警告:@MrFlick向你展示了使用&#34; reshape&#34;包(为什么不&#34; reshape2&#34;?最好保持更新!)但是,他并没有在他的回答中解释警告。

第一个警告基本上是告诉你你试图放入&#34;值&#34;的变量。列(度量变量)是不同的类型(一些可能是字符,其他可能是因素,其他可能是数字)。在这种特殊情况下,&#34; ADDRESS&#34;和&#34; OWNERNAME&#34; (因子)与其余列中的数值一起放入同一列,因此出现错误。 @ MrFlick建议将这些列视为键,即使它们可能不会解决 问题。

第二个警告是当ID组合不唯一时通常会收到的警告。如果您的数据与此处的示例数据类似,并且您遵循@ MrFlick的建议,那么您应该没问题。否则,您需要添加另一列以使ID变量唯一,以避免让dcast自动使用length作为其fun.aggregate函数。

答案 1 :(得分:3)

好吧,使用此示例data.frame

data2<-data.frame(brt_id=11000600, 
    ADDRESS = "00108-WHARTON-ST",
    OWNERNAME = "PRUSINOWSKI-JOSEPHINE",
    year=2001:2006,
    PRINCIPAL =0,
    INTEREST =0,
    PENALTY =0,
    OTHER =0,
    TOTAL.LIEN.STATUS=0
)

然后我想你会发现

library(reshape2)
data2m <- melt(data2, id=c("brt_id","ADDRESS","OWNERNAME","year"))
data2c <- dcast(data2m, brt_id+ADDRESS+OWNERNAME+year~...)

将生成原始data.frame。这个想法是,即使地址和所有者名称不一定是密钥的一部分,您也希望将它们视为关键,这样它们也不会融化。

最后,要按照您的意愿逐年扩大,请使用

dcast(data2m, brt_id+ADDRESS+OWNERNAME~...)