从长到高转换但是对列标题进行分组

时间:2016-05-06 13:51:11

标签: r data.table reshape2

我有一个长格式的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

我想要的是labelgrp订购meansd之后的列...就像这样

    label mean_C90 sd_C90 mean_D20 sd_D20 mean_H09 sd_H09 mean_Z89 sd_Z89

我被困住了!

2 个答案:

答案 0 :(得分:7)

您需要先熔化dd,以便meansd的值位于同一列中:

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中以删除重复的名称。
  • 以上结果通过每个= 2参数传递给rep,以便重复两次。
  • 这些重复的值粘贴到&#34;表示_&#34;和&#34; sd _&#34;构建所需的列顺序。
  • &#34;标签&#34;连接到此字符串向量的前面。

setcolorder的一个好处是它通过引用更改数据,因此它不涉及data.table的任何复制(即,它超快)。