把多個波次的調查資料(CSV 或 SPSS 的 .sav 檔)接在一起,不用寫程式:
pivot_wider()/pivot_longer())每一步都會自動核對列數與欄位數,並用白話說明「誰被留下、誰被排除」。適用於 KIT 資料,也適用於其他任何多波次資料。
| 本機版(方法 1、2) | 雲端版(方法 3) | |
|---|---|---|
| 資料存放 | 只在您的電腦上處理,不會上傳 | 上傳到位於美國的 Posit 伺服器處理 |
| 適合的資料 | 所有資料,包含含個資或受 IRB 限制的資料 | 已去識別化的資料 |
| 需要安裝 | 需要安裝 R(免費) | 不用安裝,開瀏覽器即可 |
| 檔案大小 | 單檔 500 MB | 單檔 500 MB,大檔案較慢 |
不確定時,請用本機版。
run.bat(可能只顯示為 run)。
啟動失敗時,黑色視窗會顯示錯誤,原因也會記錄在資料夾裡的
kitjoin_log.txt。請把它的內容貼到 GitHub Issues 回報。
Mac 與 Linux 使用者請用這個方法。 建議使用 R 4.2 以上版本(R 下載)。
打開 R 或 RStudio,在 Console(主控台)貼上下面的指令並按 Enter。
安裝 kitJoin(只需要做一次):
install.packages("pak")
# pak::pkg_install("jiewenTsai/kitJoin")
install.packages("kitJoin", repos = c('https://jiewentsai.r-universe.dev', 'https://cloud.r-project.org'))
pak 會順便把版本太舊的套件更新到 kitJoin 需要的版本(例如 bslib 要 0.11.0 以上)。
如果 pak 安裝失敗,可以改用(upgrade = "always" 才會更新太舊的套件):
install.packages("remotes")
remotes::install_github("jiewenTsai/kitJoin", upgrade = "always")
打開時說「bslib 版本太舊」:在 R 執行 install.packages("bslib"),再重新開啟。
啟動(每次使用時執行):
kitJoin::run_kitjoin()
瀏覽器會自動開啟 kitJoin。用完後回到 R 按 Esc(或 RStudio 的紅色停止鈕)即可結束。
免安裝,直接以瀏覽器開啟:(網址待部署後補上)
[!WARNING] 上傳的資料會傳送到 Posit Connect Cloud 位於美國的伺服器處理。含個資或受 IRB 限制的資料,請改用本機版。使用前請先閱讀本頁最下方的雲端版使用須知。
inst/extdata/ 資料夾裡有三個假資料檔(example_t1.csv、example_t2.csv、example_t3.csv),包含中文、遺漏值代碼 9999,以及有人在後期沒有繼續參加。
release_id,保留方式選「向後追蹤樣本」,按「執行串接」。| 分頁 | 做什麼 | 你需要做的事 |
|---|---|---|
| ① 上傳檔案 | 加入各波次的檔案、取波次名稱、預覽 | 選檔案 → 確認波次名稱(t1、t2…)與順序 |
| ②(選用)遺漏值轉 NA | 把 7777、9999 等代碼改成遺漏值;③~⑦ 沿用處理後的資料 | 確認代碼與不處理的欄位 → 執行轉換 → 下載處理後的檔案(只改遺漏值時到這裡就完成) |
| ③ 寬格式串接 | 每人一列,各波變項並排 | 選 ID 欄位與保留方式 → 執行串接 → 下載 |
| ④ 長格式疊加 | 每人每波一列,加上 wave 欄 | 執行疊加 → 下載 |
| ⑤ 流失樣本 | 標記前期的人在後期是否還在 | 選前期、後期與 ID 欄位 → 建立 → 下載 |
| ⑥ 轉成 kits 作答檔 | 寬格式(一題一欄)→ kits 的長格式作答檔 | (有遺漏值代碼時先到 ②)→ 填世代 → 確認欄位對應 → 題目設定(領域、排除、計分對照)→ 執行轉換 → 下載 .csv.gz |
| ⑦ 長寬互轉 | 一個檔案長轉寬或寬轉長 | 選檔案與方向 → 設定欄位 → 執行轉換 → 下載 |
| ⑧ 檔案格式轉換 | 一個檔案轉成另一種格式(與其他分頁無關) | 選檔案 → 選格式 → 開始轉換 → 下載 |
每個分頁最下方的「用 R 怎麼做?」會依您的設定產生對應的 R 程式碼(tidyverse 版與 base R 版;⑥⑦ 只有 tidyverse 版,⑧ 沒有),方便學習或寫進論文的方法說明。
多個檔案會合併成一個作答檔。 只要一個波次或一個領域時,請在 ① 只上傳那一個檔案。
輸出固定 9 欄,名稱、順序與型別和 kits 的示範資料相同:
| 欄位 | 必填 | 從哪裡來 |
|---|---|---|
visit_id |
是 | 自動組成 {cohort}_{subj_id}_{波次標籤}(例如 M03_K0001_m03g01);沒有波次標籤時改用 wave_m,畫面會提醒 |
subj_id |
否 | 對應孩子編號欄(例如 release_id) |
cohort |
是 | 每個檔案自己填(例如 M03),或選世代所在的欄;不會從檔名猜 |
sex |
否 | 對應性別欄,或每個檔案自己填 |
wave_m |
是 | 對應波次(月)欄,或每個檔案自己填(例如 18) |
age_m |
否 | 對應實際月齡欄,或每個檔案自己填 |
item_id、item_score
|
是 | 題目欄的欄名與分數 |
domain |
是 | 「3. 題目設定」:選取題目後按「設領域」,或上傳題目表(item_id、domain 兩欄) |
wave_m、sex、age_m 可以選「某一欄」「自己填」或「不用」(wave_m 必填,不能選「不用」)。選「自己填」時,「1.」的表裡每個檔案多一格要填;波次標籤預設是 ① 的波次名稱(t1、t2…,或您改過的名字)。一個檔案一個波次、檔案裡沒有波次欄時就用這個方法。自己填的值和「檔案裡有一欄、每一列都是這個值」寫出來完全相同;wave_m、age_m 要填數字。cogd01r)在題目表找不到時,會用原題 cogd01 的領域;題號保留 r。item_id、include、domain、map_raw_to_score(計分對照,寫成「原分數=計分」,例如 1=0;2=1;3=2)。下一波上傳這個檔,就會套用同樣的設定;也可以只上傳 item_id、domain 兩欄的題目表。上傳的計分對照如果改過、而這一波多了新的原分數,那一題會提醒「沒有計分」,要自己補上。.csv.gz(kitsUI 可以直接讀,單檔上限 200 MB)。.csv.gz,不會把整張長表放進記憶體。四個寬格式檔(約 9 萬列 × 150 題、近 1,000 萬列作答)在雲端版也可以一次轉完。「⑦ 長寬互轉」只要 1 個檔案。每個控制項旁邊都標了對應的 tidyr 參數名,預設值也和 tidyr 相同。
選好檔案後,⑦ 會先看一下資料。同一個 ID 有好幾列,提示「看起來是長格式」。每個 ID 一列、又有成組的題目欄(例如 lan01~lan10),提示「看起來是寬格式」。用哪一欄當 ID 可以自己改。選的方向和提示相反時,執行鈕旁會出現提醒;不會擋,也不會自動換方向。
寬轉長(pivot_longer())
| 控制項 | tidyr 參數 |
|---|---|
| 要轉成長格式的欄 |
cols:挑要轉的欄,或挑不轉的欄(例如 id、性別)、其餘全部轉 |
| 原本的欄名放到哪一欄 | names_to |
| 原本的值放到哪一欄 | values_to |
| 欄名要去掉的開頭(進階) | names_prefix |
| 從欄名取出部分的規則(進階) | names_pattern |
| 去掉空白的值(進階) | values_drop_na |
要轉的欄全部用點的,不用打欄名規則。下拉選單下面有「全選」「清除」和「lan 開頭(10 欄)」這類按鈕,一次加入一組欄,旁邊即時顯示「會轉 N 欄,保留 M 欄不動」。「用 R 怎麼做?」會照選法寫成 !c(id, sex)、starts_with("lan") 或逐欄列出。
長轉寬(pivot_wider())
| 控制項 | tidyr 參數 |
|---|---|
| 哪些欄是 id |
id_cols(預設:其餘全部欄位) |
| 新欄名來自哪一欄 | names_from |
| 要攤開的值 | values_from |
| 欄名格式(進階) |
names_glue,或 names_sep/names_prefix
|
| 欄位排列(進階) |
names_vary:fastest 或 slowest
|
| 缺的格子填什麼(進階) | values_fill |
長轉寬前會先檢查:
values_fn)。round 放在 id 欄,同一次施測會被拆成兩列。會提醒,並建議把它移到「要攤開的值」。kitsUI 分數表(一列 = 一次施測 × 一個領域)會多一個「套用 kitsUI 分數表預設」按鈕。它只填好設定,不會自動執行:
visit_id、subj_id、cohort、wave_m、age_m、sex、round(有的才用)domain;要攤開 d_score、d_score_se 和 scale
{.value}_{domain},欄位排列 slowest(同一個領域的欄放在一起)多攤開 scale 是為了分辨空白的 d_score:沒有這個領域的列(scale_motor 也空白),還是有測但還沒放上 D 量尺(例如 scale_motor 是 motor M36)。結果頁的「空白格從哪裡來?」表會分別算出這兩種情況。
匯入 CSV、CSV.GZ 或 SPSS(.sav)檔,轉成另外兩種格式之一。一次一個檔案,轉完直接下載。
| 匯入 | 可以轉成 |
|---|---|
| CSV(.csv) | CSV.GZ、SPSS |
| CSV.GZ(.csv.gz、.gz) | CSV、SPSS |
| SPSS(.sav) | CSV、CSV.GZ |
假設第 1 波有 A、B、C 三人,第 2 波有 B、C、D 三人:
| 選項 | 結果留下 |
|---|---|
| 向後追蹤樣本(left join):只保留第一波次有出席的人 | A、B、C(A 的第 2 波欄位是空白;D 不在第 1 波,不納入) |
| 全勤樣本(inner join):只保留每個波次都有出席的人 | B、C |
| 全樣本(full join):任何一波次有出席就會保留 | A、B、C、D(缺席波次的欄位是空白) |
| 情況 | attrition |
|---|---|
| 前期的 ID 在後期也有 |
0(留存) |
| 前期的 ID 在後期沒有 |
1(流失) |
| 前期的 ID 是空白 | 空白(無法判斷) |
結果的列數等於前期樣本列數;後期樣本只用來比對 ID,不會併入其他變項。如果前期檔案已經有 attrition 欄,新的欄位會叫 kit_attrition,不會覆蓋原資料。
中文變成亂碼? kitJoin 會自動辨識 UTF-8 與 BIG5 編碼。如果檔案清單出現「中文可能是亂碼」,請用 Excel 開啟原檔,選「另存新檔 → CSV UTF-8(逗號分隔)」後重新上傳。
可以上傳 Excel(.xlsx)嗎? 目前不行。請先在 Excel 另存為「CSV UTF-8」。
出現「ID 型別不一致」? 某一波的 ID 是數字、另一波是文字(例如有前導 0 或字母)。保留「自動轉成文字再比對」的勾選即可;若 ID 有前導 0(例如 007 和 7),請先在原檔統一格式。
結果說「ID 重複」? 某個檔案裡同一個 ID 出現不只一次,結果會變成一人多列。請確認檔案是否重複匯出,或改選能唯一辨識每個人的欄位。
下載的 SAV 欄名被改了? SPSS 的變項名稱有規則(例如不能以數字開頭、不能有空白)。不符合的欄名會自動改名,下載按鈕下方會列出改了哪些。
kits 作答檔說「同一列次同一題有好幾列」? 原檔可能有重複的孩子,或 visit_id 沒有分開不同波次。請確認有對應波次標籤欄(或 wave_m)。
全部題目都是同一個領域怎麼設? 先在「2. 對應欄位」把孩子編號、波次、月齡等欄對應好;不是題目的數值欄(例如體重)在「3. 題目設定」選取後按「排除」。然後按「全選」,在「設領域」選或輸入 lan,按「設領域」。
檔案裡沒有波次欄(一個檔案就是一個波次)怎麼辦? 在 ⑥ 的「2. 對應欄位」把波次標籤和 wave_m 選「自己填」,再到「1.」的表裡替每個檔案填(例如 m018、18)。
kits 作答檔說「沒有 0 分」? kits 的分數要從 0 開始。如果原始計分是 1–5,請在 ⑥ 的「3. 題目設定」選取這些題,平移 −1(全部都從 1 開始時,按建議的按鈕就好)。
可以在「① 上傳檔案」上傳 .csv.gz 嗎? 不行。請先到「⑧ 檔案格式轉換」把它轉成 CSV。
下載沒有反應? 請確認瀏覽器沒有封鎖下載,或改用 Chrome、Edge。
一、資料傳輸與儲存。本雲端版部署於 Posit Connect Cloud,主機位於美國 AWS us-east-2 區域。您上傳的檔案經加密連線傳送至該伺服器,暫存於伺服器的暫存空間以進行處理,本工具不另行保存、備份或分享您的資料;下載檔亦僅於您按下下載時即時產生。各使用者的資料於各自連線中處理,其他使用者無法看到。平台層級的暫存、日誌與備份由 Posit 管理,請參閱其隱私權政策。
二、平台安全性。依 Posit 官方說明:傳輸以 TLS 1.2 以上加密,靜態資料以 AES-256 加密;平台為多租戶架構,以角色權限(RBAC)隔離各客戶資料;已完成 SOC 2 Type I 稽核(Type II 預計 2027 年第一季)。以上為 Posit 之聲明,本網站未另行驗證,亦不構成任何安全保證。
三、KIT 使用者注意事項。若資料含可識別個人之資訊(如姓名、身分證字號、出生日期、地址、聯絡方式),或資料申請時之使用規範、IRB 核准計畫書限制資料存放位置或跨境傳輸,請勿上傳至雲端版。使用前請自行確認符合 KIT 資料使用規範及《個人資料保護法》相關規定。
四、建議使用方式。已去識別化之資料可使用雲端版;含個資或受 IRB 限制之資料請使用本機版(資料不會離開您的電腦)。單檔上傳上限為 500 MB;雲端運算資源有限,大型檔案處理時間較長。
五、免責聲明。本工具以現況提供,僅供資料處理輔助之用。使用者應自行確認輸出結果之正確性,並自行負擔上傳資料之合規責任。對於因使用本工具或第三方平台(Posit Connect Cloud)所生之資料外洩、遺失或其他損害,本工具開發者不負任何責任。
參考連結:Posit 安全說明 · SOC 2 稽核公告 · Posit Trust Center · Posit 隱私權政策
run.bat 經過根目錄的 app.R,套件版經過 run_kitjoin(),最後都呼叫 kit_app()(R/app.R)。jiewenTsai/kitDesign);有主要按鈕的分頁用它的 kit_run_tab_ui()/kit_run_tab_server()(頁面骨架與狀態流),分頁只寫自己的設定、執行與結果;設計規格在 kitDesign 的 brand/KIT設計語言.md。要改元件或樣式時改 kitDesign,不要在這裡另外寫 CSS。R/mod_*.R);資料處理邏輯在 R/*_pipeline.R,與介面分開,可單獨測試。devtools::test()(或 testthat::test_local())。DESCRIPTION 的 Version 與 Date;三個版本頁首顯示的版本與日期都來自這裡。R/ 檔案、或更新套件後,請重新產生雲端部署用的 manifest.json:rsconnect::writeManifest(appPrimaryDoc = "app.R")。NAMESPACE 由 roxygen2 產生:roxygen2::roxygenise()。