當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R reshape 重塑分組數據


R語言 reshape 位於 stats 包(package)。

說明

此函數在 ‘wide’ 格式(在同一行的不同列中重複測量)和 ‘long’ 格式(在不同行中重複測量)之間重塑數據幀。

用法

reshape(data, varying = NULL, v.names = NULL, timevar = "time",
        idvar = "id", ids = 1:NROW(data),
        times = seq_along(varying[[1]]),
        drop = NULL, direction, new.row.names = NULL,
        sep = ".",
        split = if (sep == "") {
            list(regexp = "[A-Za-z][0-9]", include = TRUE)
        } else {
            list(regexp = sep, include = FALSE, fixed = TRUE)}
        )

### Typical usage for converting from long to wide format:

# reshape(data, direction = "wide",
#         idvar = "___", timevar = "___", # mandatory
#         v.names = c(___),    # time-varying variables
#         varying = list(___)) # auto-generated if missing

### Typical usage for converting from wide to long format:

### If names of wide-format variables are in a 'nice' format

# reshape(data, direction = "long",
#         varying = c(___), # vector 
#         sep)              # to help guess 'v.names' and 'times'

### To specify long-format variable names explicitly

# reshape(data, direction = "long",
#         varying = ___,  # list / matrix / vector (use with care)
#         v.names = ___,  # vector of variable names in long format
#         timevar, times, # name / values of constructed time variable
#         idvar, ids)     # name / values of constructed id variable

參數

data

一個 DataFrame

varying

寬格式變量集的名稱,對應於長格式的單個變量(‘time-varying’)。這通常是變量名稱向量的列表,但它可以選擇是名稱矩陣或單個名稱向量。在每種情況下,當 direction = "long" 時,名稱可以替換為被解釋為引用 names(data) 的索引。有關更多詳細信息和選項,請參閱“詳細信息”。

v.names

長格式的變量名稱對應於寬格式的多個變量。查看具體信息'。

timevar

長格式的變量,用於區分來自同一組或個人的多個記錄。如果有多個記錄匹配,則將采用第一個記錄(並帶有警告)。

idvar

一個或多個長格式變量的名稱,用於標識同一組/個人的多個記錄。這些變量也可以以寬格式存在。

ids

用於新創建的長格式 idvar 變量的值。

times

用於新創建的長格式 timevar 變量的值。查看具體信息'。

drop

重塑之前要刪除的變量名稱向量。

direction

字符串,部分匹配 "wide" 以重塑為寬格式,或 "long" 以重塑為長格式。

new.row.names

字符或 NULL :非空值將用於結果的行名稱。

sep

長度為1的字符向量,表示寬格式變量名稱中的分隔字符。這用於根據 varying 中的名稱猜測 v.namestimes 參數。如果是 sep == "" ,則分割位置就在字母字符後麵的第一個數字之前。這也用於在重塑為寬格式時創建變量名稱。

split

包含三個組件的列表: regexpinclude 和(可選)fixed 。這允許變量名稱分割的擴展接口。查看具體信息'。

細節

盡管 reshape() 可以在各種上下文中使用,但激發應用程序的是來自縱向研究的數據,並且該函數的參數以這些術語命名和說明。縱向研究的特點是在不同時間點(假設所有單位都相同)重複測量每個被研究單位(例如個人)的相同變量,例如身高和體重。這些變量稱為time-varying變量。研究可能包括每個單元僅測量一次且不隨時間變化的其他變量(例如性別和種族);這些稱為time-constant變量。

縱向數據集的 ‘wide’ 格式表示每個單元將有一個記錄(行),通常包含一些占據單列的 time-constant 變量,以及一些占據多列的 time-varying 變量(每個時間點一列) )。同一數據集的 ‘long’ 格式表示對於每個個體將有多個記錄(行),time-constant 變量在這些記錄中保持不變,time-varying 變量在記錄中變化。 ‘long’ 格式數據集將有兩個附加變量:‘time’ 變量標識每個記錄來自哪個時間點,‘id’ 變量顯示哪些記錄引用同一單位。

轉換類型(長到寬或寬到長)由 direction 參數確定,除非 data 參數是先前調用 reshape 的結果,否則該參數是強製的。在這種情況下,隻需使用 reshape(data) 即可反轉操作(其他參數作為屬性存儲在數據幀上)。

使用 direction = "wide" 從長格式轉換為寬格式是更簡單的操作,主要在多變量分析中有用,其中數據通常被期望為 wide-format 矩陣。在這種情況下,必須指定時間變量timevar和id變量idvar。所有其他變量均假定為time-varying,除非通過v.names 參數顯式指定time-varying 變量。如果 time-constant 變量實際上不是常量,則會發出警告。

每個time-varying變量都以寬格式擴展為多個變量。這些擴展變量的名稱是自動生成的,除非它們以列表(或矩陣)的形式指定為 varying 參數,每個 time-varying 變量有一個組件(或行)。如果 varying 是名稱向量,則會隱式轉換為矩陣,每個 time-varying 變量占一行。如果有多個 time-varying 變量,請謹慎使用此選項,因為排序(按列,matrix 構造函數中的默認值)可能不直觀,而顯式列表或矩陣形式是明確的。

使用 direction = "long" 從寬格式轉換為長格式是更常見的操作,因為大多數(單變量)統計建模函數都期望長格式的數據。在隻有一個 time-varying 變量的簡單情況下,寬格式輸入中的相應列可以指定為 varying 參數,該參數可以是列名稱向量或相應的列索引。組合這些列的長格式輸出中相應變量的名稱可以選擇指定為 v.names 參數,並將時間變量的名稱指定為 timevar 參數。用作與寬格式中不同列相對應的時間值的值可以指定為times 參數。如果未指定 v.names,該函數將嘗試從 varying 猜測 v.namestimes(在這種情況下,未使用顯式指定的 times 參數)。默認值需要像 x.1x.2 這樣的變量名稱,其中 sep = "." 指定在點處拆分並將其從名稱中刪除。要讓字母順序後跟數字時間,請使用 sep = ""

可以通過兩種方式指定多個 time-varying 變量,即使用 varying 作為上述原子向量,或作為列表(或矩陣)。如果使用如上所述的自動變量名稱分割,第一種形式是有用的(並且是強製性的);這要求所有 time-varying 變量的名稱以相同的方式進行適當格式化,並且 v.names 未指定。如果varying是一個列表(每個time-varying變量有一個組成部分)或一個矩陣(每個time-varying變量有一行),則不會嘗試變量名稱拆分,並且v.namestimes通常需要被指定,盡管它們將分別默認為每個集合中的第一個變量名稱和順序時間。

此外,如果顯式給出 v.names,則不會嘗試猜測,即使 varying 是原子向量。在這種情況下, time-varying 變量的數量被視為 v.names 的長度,並且 varying 被隱式轉換為矩陣,每個 time-varying 變量占一行。與長到寬轉換的情況一樣,矩陣是按列填充的,因此需要注意 varying 中變量名稱(或索引)的順序,就像 x.1 一樣, y.1x.2y.2 (即同一時間點對應的變量需要分組在一起)。

split 參數通常不是必需的。 split$regexp 組件傳遞給 strsplitregexpr ,如果 split$includeTRUE ,則使用後者,在這種情況下,拆分發生在匹配字符串的第一個字符之後。在 strsplit 情況下,分隔符不包含在結果中,並且可以使用 split$fixed 指定 fixed-string 匹配。

重新整形後的 DataFrame 添加了屬性,以簡化重新整形回到原始形式的過程。

例子

summary(Indometh) # data in long format

## long to wide (direction = "wide") requires idvar and timevar at a minimum
reshape(Indometh, direction = "wide", idvar = "Subject", timevar = "time")

## can also explicitly specify name of combined variable
wide <- reshape(Indometh, direction = "wide", idvar = "Subject",
                timevar = "time", v.names = "conc", sep= "_")
wide

## reverse transformation
reshape(wide, direction = "long")
reshape(wide, idvar = "Subject", varying = list(2:12),
        v.names = "conc", direction = "long")

## times need not be numeric
df <- data.frame(id = rep(1:4, rep(2,4)),
                 visit = I(rep(c("Before","After"), 4)),
                 x = rnorm(4), y = runif(4))
df
reshape(df, timevar = "visit", idvar = "id", direction = "wide")
## warns that y is really varying
reshape(df, timevar = "visit", idvar = "id", direction = "wide", v.names = "x")


##  unbalanced 'long' data leads to NA fill in 'wide' form
df2 <- df[1:7, ]
df2
reshape(df2, timevar = "visit", idvar = "id", direction = "wide")

## Alternative regular expressions for guessing names
df3 <- data.frame(id = 1:4, age = c(40,50,60,50), dose1 = c(1,2,1,2),
                  dose2 = c(2,1,2,1), dose4 = c(3,3,3,3))
reshape(df3, direction = "long", varying = 3:5, sep = "")


## an example that isn't longitudinal data
state.x77 <- as.data.frame(state.x77)
long <- reshape(state.x77, idvar = "state", ids = row.names(state.x77),
                times = names(state.x77), timevar = "Characteristic",
                varying = list(names(state.x77)), direction = "long")

reshape(long, direction = "wide")

reshape(long, direction = "wide", new.row.names = unique(long$state))

## multiple id variables
df3 <- data.frame(school = rep(1:3, each = 4), class = rep(9:10, 6),
                  time = rep(c(1,1,2,2), 3), score = rnorm(12))
wide <- reshape(df3, idvar = c("school", "class"), direction = "wide")
wide
## transform back
reshape(wide)

也可以看看

stackapermrelist 用於重塑 unlist 的結果。 xtabsas.data.frame.table 用於創建列聯表並將其轉換回數據幀。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Reshape Grouped Data。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。