我有以下数据的宽格式,每行代表一个展厅,季度是从哪个季度展厅开始销售和开始年度是财政年度的开始。
Code Quarter StartingYear Quarter1_Num.FY16-17 Quarter2_Num.FY16-17 Quarter3_Num.FY16-17 Quarter4_Num.FY16-17 Quarter1_Num.FY17-18 Quarter2_Num.FY17-18 Quarter3_Num.FY17-18 Quarter4_Num.FY17-18
S2249 2 FY16-17 0 23 0 0 2 0 6 0
S463 3 FY17-18 0 0 4 0 0 4 90 8 对于每个代理,我必须从基于季度和开始年份的列开始(row1的第2季度_NU.FY 16-17),并覆盖一年的时间,在这种情况下,这意味着第2季度_数字。可以看到,列名是基于季度和StartingYear的。
我想得到的是:
Code Quarter1_Starting_Num Quarter2_Starting_Num Quarter3_Starting_Num Quarter4_Starting_Num Quarter5_Starting_Num
S2249 23 0 0 2 0
S463 4 0 0 4 90 在展厅开始后,这些栏目记录了整个季度的数据。
我知道使用gsub可以得到包含FY16-17或FY17-18的列。但是,我不知道如何为每一行指定起始列,然后为N行指定遍历。
有人能帮我吗?
发布于 2019-03-12 09:49:11
首先,我们将数据集从wide传输到long,然后进行计算和筛选,最后将其转换回wide格式。
library(dplyr)
library(tidyr)
gather(df, k,val,-c(Code,Quarter,StartingYear)) %>%
mutate(Quar=gsub('Quarter(\\d)_.*','\\1',k),year=gsub('Quarter\\d_Num\\.(.*)\\.(.*)','\\1-\\2',k)) %>%
arrange(Code) %>% group_by(Code) %>%
mutate(flag=cumsum(cumsum(Quarter==Quar & StartingYear==year)), Quarter1=paste0('Quarter',flag,'_Starting_Num')) %>%
filter(between(flag,1,5)) %>% select(Code,Quarter1,val) %>% spread(Quarter1,val)
# A tibble: 2 x 6
# Groups: Code [2]
Code Quarter1_Starting_Num Quarter2_Starting_Num Quarter3_Starting_Num Quarter4_Starting_Num Quarter5_Starting_Num
<fct> <int> <int> <int> <int> <int>
1 S2249 23 0 0 2 0
2 S463 4 0 0 4 90数据
df <- structure(list(Code = structure(1:2, .Label = c("S2249", "S463"
), class = "factor"), Quarter = 2:3, StartingYear = structure(c(1L,
1L), .Label = "FY16-17", class = "factor"), Quarter1_Num.FY16.17 = c(0L,
0L), Quarter2_Num.FY16.17 = c(23L, 0L), Quarter3_Num.FY16.17 = c(0L,
4L), Quarter4_Num.FY16.17 = c(0L, 0L), Quarter1_Num.FY17.18 = c(2L,
0L), Quarter2_Num.FY17.18 = c(0L, 4L), Quarter3_Num.FY17.18 = c(6L,
90L), Quarter4_Num.FY17.18 = c(0L, 8L)), class = "data.frame", row.names = c(NA,
-2L))PS:我将S463 3 FY17-18更改为S463 3 FY16-17以匹配预期的输出,您可以保留S463 3 FY17-18,但是您将获得Q3到Q5的NAs
gsub('Quarter(\\d)_.*','\\1',c('Quarter1_Num.FY16.17','Quarter4_Num.FY17.18'))
[1] "1" "4"
'Quarter(\\d)_.*'对一个数字进行分组,即季度后和之前的1-9,然后使用\\1返回该组。
gsub(‘Quarter\d_Num\.(.*)\(.*)’,‘1-\2’,c(‘Quarter1_Num.FY 16.17’,‘Quarter4_Num.FY17.18’)1 "FY16-17“”18 17-18“\\.跳过一个逐个季度的字面点,后面跟着一个digit_Num。在正则表达式中,我们使用.跳过特殊字符(如\\ )。(.*)组,在一个组中,在一个组中,在下一个点之后和下一个点之前的任何东西,即FY16和FY17。gsub将把这看作是第一组\\.跳过文字点(.*)组在一组( 17和18 )点后的任何一组,gsub将将其视为第2组。\\1-\\2返回组1和组2被-分离,即by 16-17https://stackoverflow.com/questions/55117412
复制相似问题