【问题标题】:Reshape data frame with dcast and melt使用 dcast 和 melt 重塑数据框
【发布时间】:2012-03-19 15:51:42
【问题描述】:

我实现了两个函数reshape_longreshape_wide(参见下面的完整工作示例)来重塑数据框。 我创建了几个小例子,这两个函数似乎工作正常。

但是,使用 reshape_wide 函数 在我的真实数据集(大约 200.000 到 300.000 行)上失败。发生的情况是将 X、Y 和 Z 的所有值设置为 1。 我的真实数据的结构看起来和下面的小例子完全一样。经过2天的工作,我认为 问题是“主键”(test_namegroup_nameid)仅在宽格式中是唯一的。应用后 reshape_long 函数主键不再唯一。我想知道,谁能告诉我这一步是否 从d1 -> reshape_wide -> d2 可以工作,因为d1 的非唯一性?

library(reshape2) 
library(taRifx) 

reshape_long <- function(data, ids) {      
        # Bring data into long form 
        data_long <- melt(data, id.vars = ids, 
                          variable.name="Data_Points", value.name="value") 
        data_long$value <- as.numeric(data_long$value) 
        # Remove rows were analyte value is NA 
        data_long <- data_long[!is.na(data_long$value), ] 
        # Resort data 
        formula_sort <- as.formula(paste("~", paste(ids, collapse="+"))) 
        data_long <- sort(data_long, f = formula_sort) 
        return(data_long) 
} 

reshape_wide <- function(data, ids) { 
        # Bring data into wide form 
        formula_wide <- as.formula(paste(paste(ids, collapse="+"), 
                                   "~ Data_Points")) 
        data_wide <- dcast(data, formula_wide) 
        # Resort data 
        formula_sort <- as.formula(paste("~", paste(ids, collapse="+"))) 
        data_wide <- sort(data_wide, f = formula_sort) 
        return(data_wide) 
} 

d <- data.frame( 
        test_name = c(rep("Test_A", 6), rep("Test_B", 6)), 
        group_name = c(rep("Group_C", 3), rep("Group_D", 3), 
                       rep("Group_C", 3), rep("Group_D", 3)), 
        id = c("I1", "I2", "I3", "I4", "I5", "I6",                           
               "I1", "I2", "I3", "I7", "I8", "I9"), 
        X = c(NA,NA,1,2,3,4,5,6,NA,7,8,9), 
        Y = as.numeric(10:21), 
        Z = c(NA,22,23,NA,24,NA,25,26,NA,27,28,29) 
) 

d 
d1 <- reshape_long(d, ids=c("test_name", "group_name", "id")) 
d1 
d2 <- reshape_wide(d1, ids=c("test_name", "group_name", "id")) 
d2 

identical(d,d2) 

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    您编写函数的方式假设ids(在您的示例中为test_namegroup_nameid)的组合在原始数据中是唯一的。看到这一点的最简单方法是获取您的 d 并重复行。

    > ddup <- rbind(d,d)
    > ddup1 <- reshape_long(ddup, ids=c("test_name", "group_name", "id")) 
    > ddup2 <- reshape_wide(ddup1, ids=c("test_name", "group_name", "id")) 
    Aggregation function missing: defaulting to length
    > 
    > identical(ddup,ddup2) 
    [1] FALSE
    

    请注意,您的 reshape_wide 假定 idsData_Points 一起是唯一的。在此示例中,它们不是。警告消息表明dcast 已使用length 将每个组合的多个值汇总为一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2021-05-12
      • 2022-08-05
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多