2012-03-07 47 views
0

我写了两个包装函数用于投射和融化,以将我的数据从长条形码 变为宽幅形式,反之亦然。然而,我仍然在努力使功能 reshape_wide它把长形式的数据变成宽的形式。R重塑数据从长到宽,反之亦然

以下是我的示例函数和运行它的代码。我创建了一个宽的 格式的dummy data.frame,我使用我的reshape_long函数将其重塑为长格式,然后使用我的reshape_wide函数将其转换回原始宽格式。但是,重塑失败的原因是我无法想象它。看来dcast中使用的公式是错误的。

reshape_long <- function(data, identifiers) { 
    data_long <- melt(data, id.vars = identifiers, 
          variable.name="name", value.name="value") 
    data_long$value <- as.numeric(data_long$value) 
    data_long <- data_long[!is.na(data_long$value), ] 
    return(data_long) 
} 

reshape_wide <- function(data, identifiers, name) { 
    if(is.null(identifiers)) { 
     formula_wide <- as.formula(paste(paste(identifiers,collapse="+"), 
            "series ~ ", name))  
    } else { 
     formula_wide <- as.formula(paste(paste(identifiers,collapse="+"), 
            "+ series ~ ", name)) 
    } 
    series <- ave(1:nrow(data), data$name, FUN=function(x) { seq.int(along=x) }) 
    data <- cbind(data, series) 
    data_wide <- dcast(data, formula_wide, value.var="value") 
    data_wide <- data_wide[,!(names(data_wide) %in% "series")] 
    return(data_wide) 
} 


data <- data.frame(ID = rep("K", 6), Type = c(rep("A", 3), rep("B", 3)), 
        X = c(NA,NA,1,2,3,4), Y = 5:10, Z = c(NA,11,12,NA,14,NA)) 
data <- reshape_long(data, identifiers = c("ID", "Type")) 
data 
reshape_wide(data, identifiers = c("ID", "Type"), name="name") 

这里是我的右输出链接,当我运行上面的代码:

http://pastebin.com/ej8F9GnL

什么是错的,在列B型出现5次,而不是3倍,因为它应该是。 你有相同的data.frame吗?

这里是sessionInfo()

> sessionInfo() 
R version 2.14.0 (2011-10-31) 
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] grid  stats  graphics grDevices utils  datasets methods 
[8] base  

other attached packages: 
[1] reshape2_1.2.1  outliers_0.14  lme4_0.999375-42  
[4] Matrix_1.0-1   gregmisc_2.1.2  gplots_2.10.1  
[7] KernSmooth_2.23-7 caTools_1.12   bitops_1.0-4.1  
[10] gtools_2.6.2   gmodels_2.15.1  gdata_2.8.2   
[13] lattice_0.20-0  dataframes2xls_0.4.5 RankProd_2.26.0  
[16] R.utils_1.9.3  R.oo_1.8.3   R.methodsS3_1.2.1 
[19] xlsx_0.3.0   xlsxjars_0.3.0  rJava_0.9-2   
[22] rj_1.0.0-3   

loaded via a namespace (and not attached): 
[1] MASS_7.3-16 nlme_3.1-102 plyr_1.6  rj.gd_1.0.0-1 stats4_2.14.0 
[6] stringr_0.5 tools_2.14.0 
+0

这适用于我的机器。你使用的是什么版本的重塑包?也许将'sessionInfo()'的结果添加到你的问题中。 – Andrie 2012-03-07 15:44:06

回答

0

的例子不能工作: 由于ID和类型不构成主键 (即,因为有几行用相同的ID和类型), 当数据被放在高高的格式,你没有如果两个值来自同一行,则知道 。

另外,我不确定你想用你的series列, 做什么,但它似乎并不奏效。

library(reshape2) 
d <- data.frame(
    ID = rep("K", 6), 
    Type = c(rep("A", 3), rep("B", 3)), 
    X = c(NA,NA,1,2,3,4), 
    Y = 5:10, 
    Z = c(NA,11,12,NA,14,NA) 
) 
d$row <- seq_len(nrow(d)) # (row,ID,Type) is now a primary key 
d 
d1 <- reshape_long(d, identifiers = c("row", "ID", "Type")) 
d1 
dcast(d1, row + ID + Type ~ name) # Probably what you want 
reshape_wide(d1, identifiers = c("row", "ID", "Type"), name="name") 
+0

它现在。这是没有“主键”的问题!大。非常感谢! – user969113 2012-03-08 18:19:59

0

问题可能是这里,r输出:

series <- ave(1:nrow(data), data$name, FUN=function(x) { seq.int(along=x) }) 

要出去了在函数中使用 “$” 的习惯,因为它不解释传递的值。使用“[”和不要引用参数:

series <- ave(1:nrow(data), data[[name]], FUN=function(x) { seq.int(along=x) }) 

在这个例子中它不会有所作为,因为name ==“名”,但如果你想与任何其他值使用它的name它会失败。

+0

使用ave的两种方法给出完全相同的结果。我不认为这是问题。我认为这是我使用dcast功能的方式。然而,当数据平衡时,从宽 - >长 - >宽的工作重塑工作!请尝试使用以下data.frame:data < - data.frame(ID = rep(“K”,6),Type = c代表( “A”,3),代表( “B”,3)), \t \t \t \t X = 1:6,Y = 7:12,Z = 13时18) – user969113 2012-03-07 17:05:36