在 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。
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
我想重新格式化这个数据框:
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。
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