使用融化從寬到長格式
融化:基礎知識
融化用於將資料從寬格式轉換為長格式。
從廣泛的資料集開始:
DT = data.table(ID = letters[1:3], Age = 20:22, OB_A = 1:3, OB_B = 4:6, OB_C = 7:9)
我們可以使用 data.table 中的 melt
函式來融化我們的資料。這將以長格式返回另一個 data.table:
melt(DT, id.vars = c("ID","Age"))
1: a 20 OB_A 1
2: b 21 OB_A 2
3: c 22 OB_A 3
4: a 20 OB_B 4
5: b 21 OB_B 5
6: c 22 OB_B 6
7: a 20 OB_C 7
8: b 21 OB_C 8
9: c 22 OB_C 9
class(melt(DT, id.vars = c("ID","Age")))
# "data.table" "data.frame"
未在 id.vars
引數中設定的任何列都被假定為變數。或者,我們可以使用 measure.vars
引數顯式設定它們:
melt(DT, measure.vars = c("OB_A","OB_B","OB_C"))
ID Age variable value
1: a 20 OB_A 1
2: b 21 OB_A 2
3: c 22 OB_A 3
4: a 20 OB_B 4
5: b 21 OB_B 5
6: c 22 OB_B 6
7: a 20 OB_C 7
8: b 21 OB_C 8
9: c 22 OB_C 9
在這種情況下,假設未在 measure.vars
中設定的任何列都是 ID。
如果我們明確地設定它們,它將只返回所選的列:
melt(DT, id.vars = "ID", measure.vars = c("OB_C"))
ID variable value
1: a OB_C 7
2: b OB_C 8
3: c OB_C 9
在結果中命名變數和值
我們可以使用 variable.name
和 value.name
來操作返回表的列名
melt(DT,
id.vars = c("ID"),
measure.vars = c("OB_C"),
variable.name = "Test",
value.name = "Result"
)
ID Test Result
1: a OB_C 7
2: b OB_C 8
3: c OB_C 9
在結果中設定度量變數的型別
預設情況下,熔化 data.table 會將所有 measure.vars
轉換為因子:
M_DT <- melt(DT,id.vars = c("ID"), measure.vars = c("OB_C"))
class(M_DT[, variable])
# "factor"
要設定為字元,請使用 variable.factor
引數:
M_DT <- melt(DT,id.vars = c("ID"), measure.vars = c("OB_C"), variable.factor = FALSE)
class(M_DT[, variable])
# "character"
值通常從原始列的資料型別繼承:
class(DT[, value])
# "integer"
class(M_DT[, value])
# "integer"
如果存在衝突,則會強制執行資料型別。例如:
M_DT <- melt(DT,id.vars = c("Age"), measure.vars = c("ID","OB_C"))
class(M_DT[, value])
# "character"
融化時,任何因子變數都將被強制轉換為字元型別:
DT[, OB_C := factor(OB_C)]
M_DT <- melt(DT,id.vars = c("ID"), measure.vars = c("OB_C"))
class(M_DT)
# "character"
要避免這種情況並保留初始輸入,請使用 value.factor
引數:
M_DT <- melt(DT,id.vars = c("ID"), measure.vars = c("OB_C"), value.factor = TRUE)
class(M_DT)
# "factor"
處理缺失值
預設情況下,任何 NA
值都保留在熔融資料中
DT = data.table(ID = letters[1:3], Age = 20:22, OB_A = 1:3, OB_B = 4:6, OB_C = c(7:8,NA))
melt(DT,id.vars = c("ID"), measure.vars = c("OB_C"))
ID variable value
1: a OB_C 7
2: b OB_C 8
3: c OB_C NA
如果應從你的資料中刪除這些,請設定 na.rm = TRUE
melt(DT,id.vars = c("ID"), measure.vars = c("OB_C"), na.rm = TRUE)
ID variable value
1: a OB_C 7
2: b OB_C 8