Цикл по столбцам и дублирование данных в R - PullRequest
0 голосов
/ 13 сентября 2018

Я пытаюсь перебрать столбцы, и если столбец - целый год, он должен быть продублирован четыре раза и переименован в кварталы

Итак, это

2000   Q1-01   Q2-01   Q3-01
   1       2       3       3    

Должно стать так:

Q1-00   Q2-00   Q3-00   Q4-00   Q1-01   Q2-01   Q3-01   
   1       1       1       1       2       3       3

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Поскольку вам нужны повторяющиеся столбцы, вы можете просто переиндексировать фрейм данных и затем обновить имена столбцов

df <- structure(list(`2000` = 1L, Q1.01 = 2L, Q2.01 = 3L, Q3.01 = 3L,
    `2002` = 1L, Q1.03 = 2L, Q2.03 = 3L, Q3.03 = 3L), row.names = c(NA,
    -1L), class = "data.frame")
#> df
#2000 Q1.01 Q2.01 Q3.01 2002 Q1.03 Q2.03 Q3.03
#1    1     2     3     3    1     2     3     3

# Get indices of columns that consist of 4 numbers
col.ids <- grep('^[0-9]{4}$', names(df))

# For each of those, create new names, and for the rest preserve the old names 
new.names <- lapply(seq_along(df), function(i) {
    if (i %in% col.ids)
        return(paste(substr(names(df)[i], 3, 4), c('Q1', 'Q2', 'Q3', 'Q4'), sep = '.'))
    return(names(df)[i])
})

# Now repeat each of those columns 4 times
df <- df[rep(seq_along(df), ifelse(seq_along(df) %in% col.ids, 4, 1))]

# ...and finally set the column names to the desired new names
names(df) <- unlist(new.names)
#> df
#00.Q1 00.Q2 00.Q3 00.Q4 Q1.01 Q2.01 Q3.01 02.Q1 02.Q2 02.Q3 02.Q4 Q1.03 Q2.03 Q3.03
#1     1     1     1     1     2     3     3     1     1     1     1     2     3     3
0 голосов
/ 13 сентября 2018

Мы можем использовать stringr::str_detect для поиска имен столбцов с 4 цифрами, а затем взять последние две цифры из этих столбцов

library(dplyr)
library(tidyr)
library(stringr)
df %>% gather(key,value) %>% group_by(key) %>% 
       mutate(key_new = ifelse(str_detect(key,'\\d{4}'),paste0('Q',1:4,'-',str_extract(key,'\\d{2}$'),collapse = ','),key)) %>% 
       ungroup() %>% select(-key) %>% 
       separate_rows(key_new,sep = ',') %>% spread(key_new,value)

PS: надеюсь, у вас нет большого набора данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...