[英]Converting long format flat file to wide in R
我有一個長整型格式的家庭和成員數據集。 成員數固定,每個成員對應一列。 為簡單起見,假設每個家庭2個成員,並假設對成員(Q1),性別(Q2)提出2個問題。
文件格式如下所示:
HHID, MEM_ID_1, MEM_ID_2, AGE_1, AGE_2, GENDER_1, GENDER_2
1 1 2 50 45 M F
我想將其轉換為以下格式:
HHID MEM_ID AGE GENDER
1 1 50 M
1 2 45 F
假設我們的數據框是測試的
dput(test)
structure(list(HHID = 1L, MEM_ID_1 = 1L, MEM_ID_2 = 2L, AGE_1 = 50L,
AGE_2 = 45L, GENDER_1 = structure(1L, .Label = "Male", class = "factor"),
GENDER_2 = structure(1L, .Label = "Female", class = "factor")), class = "data.frame", row.names = c(NA,
-1L))
您可以嘗試在此數據幀上使用重塑功能,如下所示:
reshape(test, direction = "long",
varying = list(c("MEM_ID_1","MEM_ID_2"), c("AGE_1","AGE_2"), c( "GENDER_1","GENDER_2")),
v.names = c("MEM_ID","AGE","GENDER"),
idvar = 'HHID')
reshape()函數來自基數R。廣義上講,它可以通過使用變化的參數並將direction設置為long來同時融化多組變量。
例如,在您的情況下,我們為可變參數提供了三個變量名稱向量的列表:
varying = list(c("MEM_ID_1","MEM_ID_2"), c("AGE_1","AGE_2"), c( "GENDER_1","GENDER_2"))
輸出如下:
HHID time MEM_ID AGE GENDER
1.1 1 1 1 50 Male
1.2 1 2 2 45 Female
您可以按tidyr::gather()
使用tidyr::gather()
, tidyr::separate()
和tidyr::spread()
。 這里household
是您數據框的名稱。
library(tidyverse)
gather
首先, tidyr::gather()
。 然后,您可以獲得以下結果。
household %>%
gather(-HHID, key = domestic, value = value)
#> HHID domestic value
#> 1 1 MEM_ID_1 1
#> 2 1 MEM_ID_2 2
#> 3 1 AGE_1 50
#> 4 1 AGE_2 45
#> 5 1 GENDER_1 M
#> 6 1 GENDER_2 F
現在您要做的就是
_[0-9]
處的單獨domestic
列:在正則表達式中, _(?=[0-9])
household %>%
gather(-HHID, key = domestic, value = value) %>% # long data
separate(domestic, into = c("domestic", "vals"), sep = "_(?=[0-9])") %>% # separate the digit
spread(domestic, value) %>% # wide format
select(HHID, MEM_ID, AGE, GENDER, -vals) # just arranging columns, and excluding needless column
#> HHID MEM_ID AGE GENDER
#> 1 1 1 50 M
#> 2 1 2 45 F
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.