【问题标题】:Reformatting data frame shape in R [duplicate]在R中重新格式化数据框形状[重复]
【发布时间】:2018-01-31 06:51:25
【问题描述】:

我想重新格式化这个数据框:

mydf <- read.table(
  text = "FORM   DOSE   gmean_AUC   mean_AUC   gmean_Cmax   mean_Cmax
  A      100     150         160          50           55
  B       50     70          75           30           32",
  header = TRUE, stringsAsFactors = FALSE)

如下:

mydfout <-
EXPOSURE    FORM     DOSE   gmean     mean
 AUC        A       100     150       160
 AUC        B       50      70         75
 Cmax       A       100     50         55
 Cmax       B       50      30         32

如何在 R 中执行此操作。这种重新格式化将使我在 R 中生成和导出表格变得非常容易。

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    这是一个非常标准的“从宽到长”的重塑问题,因此reshape() 函数是一个很好的起点。

    reshape(mydf, direction = "long", idvar = 1:2, varying = 3:ncol(mydf), 
        timevar = "EXPOSURE", sep = "_")
    ##            FORM DOSE EXPOSURE gmean mean
    ## A.100.AUC     A  100      AUC   150  160
    ## B.50.AUC      B   50      AUC    70   75
    ## A.100.Cmax    A  100     Cmax    50   55
    ## B.50.Cmax     B   50     Cmax    30   32
    

    另一个选项是来自“data.table”的melt()(而不是来自“reshape2”的melt()):

    melt(as.data.table(mydf), measure.vars = patterns("^gmean", "^mean"))
    

    缺点是您没有获得“AUC”和“Cmax”值,但您可以手动重新引入这些值:

    melt(as.data.table(mydf), measure.vars = patterns("^gmean", "^mean"))[
      , variable := factor(variable, labels = c("AUC", "Cmax"))][]
    

    要在“data.table”团队处理此问题时解决此问题,您也可以尝试ReshapeLong_() from this Gist

    用法是:

    ReshapeLong_(mydf, c(gmean = "^gmean_", mean = "^mean_"), variable.name = "EXPOSURE")
    ##    DOSE FORM EXPOSURE gmean mean
    ## 1:  100    A      AUC   150  160
    ## 2:   50    B      AUC    70   75
    ## 3:  100    A     Cmax    50   55
    ## 4:   50    B     Cmax    30   32
    

    【讨论】:

      【解决方案2】:

      使用 的解决方案。

      library(dplyr)
      library(tidyr)
      
      mydfout <- mydf %>%
        gather(Type, Value, -FORM, -DOSE) %>%
        separate(Type, into = c("Summary", "EXPOSURE")) %>%
        spread(Summary, Value) %>%
        select(EXPOSURE, FORM, DOSE, gmean, mean) %>%
        arrange(EXPOSURE)
      mydfout
      #   EXPOSURE FORM DOSE gmean mean
      # 1      AUC    A  100   150  160
      # 2      AUC    B   50    70   75
      # 3     Cmax    A  100    50   55
      # 4     Cmax    B   50    30   32
      

      数据

      mydf <- read.table(text = "FORM   DOSE   gmean_AUC   mean_AUC   gmean_Cmax   mean_Cmax
      A      100     150         160          50           55
                      B       50     70          75           30           32",
                      header = TRUE, stringsAsFactors = FALSE)
      

      【讨论】:

      • 非常简洁的解决方案。为了让它更简洁:mydf %&gt;% gather(var, val, 3:6) %&gt;% separate(var, c('key', 'EXPOSURE')) %&gt;% spread(key, val) %&gt;% select(EXPOSURE, everything()) %&gt;% arrange(EXPOSURE)
      • @mpalanvo 感谢分享您的解决方案。
      猜你喜欢
      • 2021-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多