重塑数据框的麻烦

时间:2013-11-17 10:09:42

标签: r reshape reshape2

我对reshape2的演员和融合功能有疑问(我认为)。

我有一个数据集,每行一名患者,所有观察结果两次(观察者x和y分开)。

编辑: - 我更改了示例数据以更好地模拟我的真实数据,因为变量已经在患者的多个级别上进行了测试 -

看起来像这样:

data <- data.frame(letters[1:2], 1:2, 3:4, 5:6, 7:8, 9:10, 11:12, 13:14, 15:16 )
colnames(data) <- c("pat_id", "var1_1_x", "var1_1_y", "var1_2_x", "var1_2_y", "var2_1_x", "var2_1_y", "var2_2_x", "var2_2_y")
data

对于分析,我希望每个观察者有一列,其中包含所有变量的所有值。所以它看起来像这样(抱歉这个糟糕的桌子):

pat.id    variable   level   obs_x  obs_y      
a          var1        1      1     3
b          var1        1      2     4
a          var1        2      5     7
b          var1        2      6     8
a          var2        1      9     11
b          var2        1      10    12
a          var2        2      13    15
b          var2        2      14    16

当我使用

dataM <- melt(data, id="pat_id")
dataM

我最终得到一个昏暗的3 x 16数据框,所有值都在一列中。我似乎无法分离两个观察者的价值观。

我还尝试使用'grep'函数将obs_x和obs_y中的所有列分别“rbind”到一个新的数据框中,并从熔化的数据集行'cbind'中获取x和y的值,但是有些变量名在其名称中包含x和y。

编辑: - 我希望这不会使我的问题过于复杂。我尝试使用reshape2函数来融合数据,而不是colsplit基于下划线,它完美无缺。当我dcast带有样本数据的数据框时,它也能正常工作,但是当我在我的真实数据(原始尺寸600x250)上使用它时,它不会:尺寸和colnames工作正常,但观察者的值x和y变为'1',我不明白为什么。 -

编辑2: - 我将真实数据重命名为虚拟

str(dummmy_melt)
'data.frame':   299008 obs. of  3 variables:
$ DesirNr : Factor w/ 584 levels "1001","1002",..: 10 20 31 41 43 44 45 46 47 57 ...
$ variable: Factor w/ 512 levels "X.1_F","ReaderNr.1_F",..: 1 1 1 1 1 1 1 1 1 1 ...
$ value   : Factor w/ 1024 levels "01 01 MRI.pdf",..: 1 2 3 4 5 6 7 8 9 10 ...

str(dummy_split)
'data.frame':   299008 obs. of  6 variables:
$ DesirNr : Factor w/ 584 levels "1001","1002",..: 10 20 31 41 43 44 45 46 47 57 ...
$ variable: Factor w/ 512 levels "X.1_F","ReaderNr.1_F",..: 1 1 1 1 1 1 1 1 1 1 ...
$ value   : Factor w/ 1024 levels "01 01 MRI.pdf",..: 1 2 3 4 5 6 7 8 9 10 ...
$ observer: chr  "F" "F" "F" "F" ...
$ afwijk  : chr  "X" "X" "X" "X" ...
$ level   : int  1 1 1 1 1 1 1 1 1 1 ...
  • 编辑结束2.

也许我完全忽略了明显的解决方案,如果有人有一些帮助,我会非常感激!

1 个答案:

答案 0 :(得分:4)

对于基础R的reshape函数来说,这更像是一项工作:

reshape(data, direction = "long", idvar="pat_id", 
        varying = 2:ncol(data), v.names=c("x", "y"), 
        times=c("var_1", "var_2"))
#         pat_id  time x y
# a.var_1      a var_1 1 4
# b.var_1      b var_1 2 3
# c.var_1      c var_1 3 2
# d.var_1      d var_1 4 1
# a.var_2      a var_2 5 8
# b.var_2      b var_2 6 7
# c.var_2      c var_2 7 6
# d.var_2      d var_2 8 5

为了记录,这是你要用“reshape2”做的事情:

library(reshape2)
dataM <- melt(data, id="pat_id")
dataM <- cbind(dataM, colsplit(dataM$variable, "_", c("V", "var", "obs")))
dcast(dataM, pat_id + var ~ obs, value.var="value")
#   pat_id var x y
# 1      a   1 1 4
# 2      a   2 5 8
# 3      b   1 2 3
# 4      b   2 6 7
# 5      c   1 3 2
# 6      c   2 7 6
# 7      d   1 4 1
# 8      d   2 8 5

我的“splitstackshape”包中还有Reshape,它主要是reshape的包装器,以允许不平衡的数据集。

library(splitstackshape)
Reshape(data, id.vars="pat_id", var.stubs=c("x", "y"), sep="_")