簡體   English   中英

無需聚合即可將 R 中的數據從長格式改成寬格式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM