簡體   English   中英

將長格式平面文件轉換為R中的寬格式

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

1. 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

現在您要做的就是

  1. _[0-9]處的單獨domestic列:在正則表達式中, _(?=[0-9])
  2. 將格式更改為寬格式,可以看到所需的輸出。

2.結論:整個代碼

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.

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