简体   繁体   中英

Looping through columns and duplicating data in R

I am trying to iterate through columns, and if the column is a whole year, it should be duplicated four times, and renamed to quarters

So this

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

Should become this:

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

Any ideas?

We can use stringr::str_detect to look for colnames with 4 digits then take the last two digits from those columns

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: I hope you don't have a large dataset

Since you want repeated columns, you can just re-index your data frame and then update the column names

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM