R中的数据从宽格式转换为长格式而不进行聚合

时间:2014-07-18 00:40:12

标签: r reshape

我正在开发一个项目,我有一个长格式的文件,包含131170个对象和4个变量;并不是所有的值都是数字的,我一直在尝试使用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的不同日期具有不同的值。

3 个答案:

答案 0 :(得分:1)

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 

答案 1 :(得分:0)

你正在构建一种情况,其中有多个项目可以粘贴到一个地方,所以dcast会询问如何组装它们。如果您只想要第一个,那么构建一个函数,将其作为&#34;聚合函数&#34 ;.:

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

答案 2 :(得分:0)

您也可以尝试使用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