【问题标题】:Trouble with reshaping a data frame重塑数据框的问题
【发布时间】:2013-11-30 12:31:35
【问题描述】:

我有一个关于 reshape2 的 cast 和 melt 功能的问题(我认为)。

我有一个数据集,每行有一个患者,所有观察都在列中两次(观察者 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”到一个新的数据帧中,并从带有 x 和 y 值的熔融数据集行中“cbind”,但有些变量名称在其名称中包含 x 和 y。

编辑:-我希望这不会使我的问题过于复杂。我尝试使用reshape2 函数来融合数据,而不是基于下划线的colsplit,它工作得很好。当我dcast 带有示例数据的数据框时它也可以工作,但是当我在我的真实数据(原始尺寸 600x250)上使用它时它不会:尺寸和列名工作正常,但观察者 x 和y 更改为“1”,我不明白为什么。 -

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

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 结束。

也许我完全忽略了明显的解决方案,如果有人有帮助,我将不胜感激!

【问题讨论】:

  • 感谢您的回答。我认为我的问题是“特殊的”(我们都这样做,不是吗?)因为我想根据 colnames/variable 名称进行拆分。

标签: r reshape reshape2


【解决方案1】:

这更像是基本 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="_")

【讨论】:

  • 我正在通过 reshape2 使用您的解决方案。我忘了提到,在我的真实数据中,您的解决方案中的“V”列也需要出现在最终结果中。我做了你在'cbinding' dataM 之前所做的事情,而不是:dcast(dataM, pat_id+V+var~observer, value.var="value")。我得到了一个具有正确尺寸的数据框,并且使用示例数据得到了正确的结果,但是,当我使用真实数据进行操作时,观察者 x 和 y 列中的值都更改为“1”?
  • 我不知道我到底做错了什么,但这可能与一位观察者的一些失踪患者有关。经过一番尝试后,我以某种方式设法使用 reshape2 meltdcast 尤其是 @Ananda Mahto 解释的 colsplit 函数得到了我想要的东西。就我自己而言,我无法想到这将是解决方案。所以,非常感谢阿南达!
猜你喜欢
  • 2013-01-27
  • 2015-10-07
  • 2017-03-10
  • 2019-05-29
相关资源
最近更新 更多