[英]Reshaping data in R from long to wide format without aggregation
我正在做一个项目,我有一个长格式的文件,包含 131170 个对象和 4 个变量; 并非所有值都是 numeric ,我一直在尝试使用 reshape2 中的 dcast 函数,但是我如何尝试它都会给我带来聚合函数丢失的错误:默认为长度。 我不想更改我的数据我只想更改文件的格式。
这是我写的函数
W_data1 <- dcast(L_data1, formula = ID + Date ~ Metric, value.var = "Value")
这是我的文件外观的示例。
ID Date Metric Value
1003 3/5/2001 Age 74
1003 3/5/2001 Age 74
1003 3/5/2001 Age 74
1003 3/5/2001 Age 74
1003 3/5/2001 Sex F
1003 3/5/2001 Sex F
1003 3/5/2001 Sex F
1003 3/5/2001 Sex F
1003 3/5/2001 Dx MM
1003 3/5/2001 Dx MM
1003 3/5/2001 Dx MM
1003 3/5/2001 Dx MM
1003 3/5/2001 ISS.Stage 1
宽格式应如下所示:
ID Age Sex Dx Date ISS Stage Heavy Chain Isotype
1003 74 F MM 3/5/2001 1 IgA
1003 74 F MM 3/5/2001 1 IgA
1003 74 F MM 3/5/2001 1 IgA
1003 74 F MM 3/5/2001 1 IgA
1004 79 F MM 1/1/1997 Unknown N/A
每个 ID 有多个数据,有些可能有 4 组数据,有些只有一组。 ID 重复的原因是因为相同的变量在不同的日期对于相同的 ID 具有不同的值。
LHS 和 RHS 变量的组合中存在重复值。 如果您不希望dcast
求助于length
则需要添加一个指示变量来区分唯一值。
尝试:
L_data1$ind <- ave(1:nrow(L_data1), L_data1[1:3], FUN = seq_along)
dcast(L_data1, ID + Date ~ Metric + ind, value.var = "Value")
# ID Date Age_1 Age_2 Age_3 Age_4 Dx_1 Dx_2 Dx_3 Dx_4 ISS.Stage_1
# 1 1003 3/5/2001 74 74 74 74 MM MM MM MM 1
# Sex_1 Sex_2 Sex_3 Sex_4
# 1 F F F F
您正在构建一种情况,其中有多个项目可以粘在一个地方,因此 dcast 询问如何组装它们。 如果你只想要第一个,那么构建一个函数,作为“聚合函数”。:
W_data1 <- dcast(L_data1, formula = ID + Date ~ Metric,
fun.aggregate=function(x){ as.character(x)[1] },
value.var = "Value")
W_data1
#---------------------
ID Date Age Dx ISS.Stage Sex
1 1003 3/5/2001 74 MM 1 F
你也可以尝试reshape
L_data1$Metric <- with(L_data1,
paste0(Metric,ave(seq_along(Metric), ID, Date, Metric, FUN = seq_along)))
res <- reshape(L_data1, timevar="Metric", idvar=c("ID", "Date"), direction="wide")
colnames(res) <- gsub("^[[:alpha:]]+\\.","",colnames(res))
res
# ID Date Age1 Age2 Age3 Age4 Sex1 Sex2 Sex3 Sex4 Dx1 Dx2 Dx3 Dx4
#1 1003 3/5/2001 74 74 74 74 F F F F MM MM MM MM
# ISS.Stage1
#1 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.