我有一个长格式的data.frame。我想重塑一下,但我关心列的排序。
这是一个玩具示例。实际上,我将有更多的组(grp
)。
# Minimum working example
mwe <- "grp mean sd label
1 C90 90 19 Heart_rate
2 D20 86 18 Heart_rate
3 H09 80 16 Heart_rate
9 Z89 89 18 Heart_rate"
# Read in the text data
dd <- read.table(text=mwe, header=TRUE)
我尝试this解决方案但没有成功。
dcast(setDT(dd), label~grp, value.var=list("mean", "sd"), sep="_" )
label mean_C90 mean_D20 mean_H09 mean_Z89 sd_C90 sd_D20 sd_H09 sd_Z89
1: Heart_rate 90 86 80 89 19 18 16 18
我想要的是label
按grp
订购mean
和sd
之后的列...就像这样
label mean_C90 sd_C90 mean_D20 sd_D20 mean_H09 sd_H09 mean_Z89 sd_Z89
我被困住了!
答案 0 :(得分:7)
您需要先熔化dd
,以便mean
和sd
的值位于同一列中:
dcast(melt(dd), label ~ grp + variable)
# label C90_mean C90_sd D20_mean D20_sd H09_mean H09_sd Z89_mean Z89_sd
#1 Heart_rate 90 19 86 18 80 16 89 18
答案 1 :(得分:3)
解决此问题的一种快捷方法是使用setcolorder
:
setcolorder(temp, c("label", paste(c("mean","sd"),
rep(unique(gsub("^(mean|sd)_", "", names(temp)[-1])), each=2), sep="_")))
这有点紧凑,所以这是件:
gsub("^(mean|sd)_", "", names(temp)[-1])
打印出变量的名称(&#34;标签&#34;除外)&#34; mean _&#34;和&#34; sd _&#34;除去。此结果包含在unique
中以删除重复的名称。rep
,以便重复两次。 setcolorder
的一个好处是它通过引用更改数据,因此它不涉及data.table的任何复制(即,它超快)。