【问题标题】:Reshaping data in R from long to wide format without aggregation在不聚合的情况下将 R 中的数据从长格式重塑为宽格式
【发布时间】:2014-07-18 00:40:12
【问题描述】:

我正在做一个项目,我有一个长格式文件,包含 131170 个对象和 4 个变量;并非所有的值都是数字的,我一直在尝试使用 reshape2 中的 dcast 函数,但是我如何尝试它却给了我聚合函数丢失的错误:默认为长度。我不想更改我的数据我只想更改文件的格式。

这是我写的函数

W_data1 <- dcast(L_data1, formula = ID + Date ~ Metric, value.var = "Value") 

这是我的文件外观的示例。

ID     Date       Metric     Value
1003    3/5/2001    Age       74
1003    3/5/2001    Age       74
1003    3/5/2001    Age       74
1003    3/5/2001    Age       74
1003    3/5/2001    Sex        F
1003    3/5/2001    Sex        F
1003    3/5/2001    Sex        F
1003    3/5/2001    Sex        F
1003    3/5/2001    Dx         MM
1003    3/5/2001    Dx         MM
1003    3/5/2001    Dx         MM
1003    3/5/2001    Dx         MM
1003    3/5/2001    ISS.Stage   1

宽格式应如下所示:

ID      Age Sex Dx  Date       ISS Stage    Heavy Chain Isotype
1003    74  F   MM  3/5/2001    1           IgA
1003    74  F   MM  3/5/2001    1           IgA
1003    74  F   MM  3/5/2001    1           IgA
1003    74  F   MM  3/5/2001    1           IgA
1004    79  F   MM  1/1/1997    Unknown     N/A

每个 ID 有多个数据,有些可能有 4 组数据,而其他只有一组。 ID重复的原因是相同的变量在不同的日期对于相同的ID具有不同的值。

【问题讨论】:

    标签: r reshape


    【解决方案1】:

    您的 LHS 和 RHS 变量的组合中有重复值。如果您不想让dcast 诉诸length,则需要添加一个指示变量来区分唯一值。

    试试:

    L_data1$ind <- ave(1:nrow(L_data1), L_data1[1:3], FUN = seq_along)
    
    dcast(L_data1, ID + Date ~ Metric + ind, value.var = "Value")
    #     ID     Date Age_1 Age_2 Age_3 Age_4 Dx_1 Dx_2 Dx_3 Dx_4 ISS.Stage_1
    # 1 1003 3/5/2001    74    74    74    74   MM   MM   MM   MM           1
    #   Sex_1 Sex_2 Sex_3 Sex_4
    # 1     F     F     F     F 
    

    【讨论】:

      【解决方案2】:

      您正在构建一种情况,其中有多个物品要粘在一个地方,因此 dcast 正在询问如何组装它们。如果您只想要第一个,那么构建一个作为“聚合函数”的函数。:

      W_data1 <- dcast(L_data1, formula = ID + Date ~ Metric, 
                       fun.aggregate=function(x){ as.character(x)[1] }, 
                       value.var = "Value")
       W_data1
      #---------------------
          ID     Date Age Dx ISS.Stage Sex
      1 1003 3/5/2001  74 MM         1   F
      

      【讨论】:

      • 这很有帮助,但是我需要将每个 ID 的所有值格式化为宽,不能丢失任何数据。
      • 如果“你不能丢失任何数据”,那么你应该发布一个复杂程度的例子来说明你在这个结果中遇到的任何问题。
      • 您需要提供一个输入数据集,您希望从中生成输出。暂时没有连接。
      • 是否可以使用 dcast 重新格式化每个重复 ID 的所有数据?
      【解决方案3】:

      你也可以试试reshape

        L_data1$Metric <- with(L_data1, 
                   paste0(Metric,ave(seq_along(Metric), ID, Date, Metric, FUN = seq_along)))
      
        res <- reshape(L_data1, timevar="Metric", idvar=c("ID", "Date"), direction="wide")
        colnames(res) <- gsub("^[[:alpha:]]+\\.","",colnames(res))
      
        res
       #    ID     Date Age1 Age2 Age3 Age4 Sex1 Sex2 Sex3 Sex4 Dx1 Dx2 Dx3 Dx4
       #1 1003 3/5/2001   74   74   74   74    F    F    F    F  MM  MM  MM  MM
       #  ISS.Stage1
       #1          1
      

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 2011-09-08
        • 2022-07-28
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        相关资源
        最近更新 更多