在 R 中重新格式化数据框形状

Reformatting data frame shape in R

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

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 中生成和导出我的 Table。

使用 and 的解决方案。

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)

这是一个非常标准的 "wide-to-long" 重塑问题,因此 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