• преобразовать набор данных из широких в длинные для имен столбцов с шаблонами - PullRequest
1 голос
/ 15 марта 2020

Давайте предположим, что такой набор данных приведен ниже.

 ID   Gender  ColA_1  ColB_1 ColC_1__1 ColC_1__2 ColA_2  ColB_2 ColC_2__1 ColC_2__2 
 1    Male    No      Yes    Yes       No        No      Yes    No        No
 2    Female  Yes     No     Yes       No        No      Yes    Yes       No

Что мне нравится делать, это преобразовать этот набор данных следующим образом

 ID Index  Gender  ColA  ColB   ColC_1 ColC_2  
 1  1      Male    No    Yes    Yes       No        
 1  2      Male    No    Yes    No        No
 2  1    Female    Yes   No     Yes       No        
 2  2    Female    No    Yes    Yes       No  

Не уверен, как это сделать, нужно Помогите. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 15 марта 2020

Вот вариант с pivot_longer

library(dplyr)
library(tidyr)
library(stringr)
df1 %>% 
     rename_at(vars(starts_with('ColC')), ~ str_replace(., "_(\\d+)__(\\d+)",
              "\\2_\\1")) %>%
     pivot_longer(cols = 3:ncol(.),  names_to = c(".value", "Index"), 
                 names_sep="_")
# A tibble: 4 x 7
#     ID Gender Index ColA  ColB  ColC1 ColC2
#  <int> <chr>  <chr> <chr> <chr> <chr> <chr>
#1     1 Male   1     No    Yes   Yes   No   
#2     1 Male   2     No    Yes   No    No   
#3     2 Female 1     Yes   No    Yes   No   
#4     2 Female 2     No    Yes   Yes   No   

data

df1 <- structure(list(ID = 1:2, Gender = c("Male", "Female"), ColA_1 = c("No", 
"Yes"), ColB_1 = c("Yes", "No"), ColC_1__1 = c("Yes", "Yes"), 
    ColC_1__2 = c("No", "No"), ColA_2 = c("No", "No"), ColB_2 = c("Yes", 
    "Yes"), ColC_2__1 = c("No", "Yes"), ColC_2__2 = c("No", "No"
    )), class = "data.frame", row.names = c(NA, -2L))
1 голос
/ 15 марта 2020

Вы можете решить свою проблему, используя пакет data.table:

library(data.table)
melt(data = setDT(df), 
     measure = patterns(ColA="ColA", ColB="ColB", ColC_1="ColC_.+1$", ColC_2="ColC_.+2$"), 
     variable.name = "index")
...