R 重塑数据帧的问题
我有一个关于重塑2的铸造和熔化功能的问题(我想) 我有一个数据集,每行一名患者,所有观察分两列(分别针对观察者x和y) 编辑:-我对示例数据做了一点修改,以更好地模拟我的真实数据,因为变量已经在患者的多个层面上进行了测试- 看起来是这样的:R 重塑数据帧的问题,r,reshape,reshape2,R,Reshape,Reshape2,我有一个关于重塑2的铸造和熔化功能的问题(我想) 我有一个数据集,每行一名患者,所有观察分两列(分别针对观察者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",
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
当我使用
dataM <- melt(data, id="pat_id")
dataM
- 编辑2结束
也许我完全忽略了显而易见的解决方案,如果有人能帮上忙,我会非常感激 这更像是base R的
重塑功能:
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
为了记录在案,以下是您必须对“重塑2”所做的操作:
谢谢你的回答。我认为我的问题是“特殊的”(我们都有,不是吗?),因为我想基于colnames/变量名进行拆分。我使用的是您的解决方案,使用的是reforme2。我忘了提到,在我的实际数据中,解决方案中的“V”列也需要在最终结果中。我做了您在“cbinding”dataM之前做的事情,然后做:dcast(dataM,pat\u id+V+var~observer,value.var=“value”)
。我得到了一个具有正确维度的数据框,通过示例数据,我得到了正确的结果,但是,当我使用真实数据时,观察者x和y列中的值都更改为“1”?我不知道一开始我到底做错了什么,但这可能与一个观察者中的一些缺失患者有关。经过更多的尝试后,我不知何故使用了Reformae2melt
、dcast
,特别是@Ananda Mahto解释的colsplit
函数,获得了我想要的。就我个人而言,我不可能想到那会是解决办法。所以,非常感谢阿南达!
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 ...
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
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
library(splitstackshape)
Reshape(data, id.vars="pat_id", var.stubs=c("x", "y"), sep="_")