我对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 ...
也许我完全忽略了明显的解决方案,如果有人有一些帮助,我会非常感激!
答案 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="_")