首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从特定列开始,根据R中的条件向上遍历到特定数量的列

从特定列开始,根据R中的条件向上遍历到特定数量的列
EN

Stack Overflow用户
提问于 2019-03-12 08:53:29
回答 1查看 38关注 0票数 0

我有以下数据的宽格式,每行代表一个展厅,季度是从哪个季度展厅开始销售和开始年度是财政年度的开始。

代码语言:javascript
复制
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的。

我想得到的是:

代码语言:javascript
复制
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行指定遍历。

有人能帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-12 09:49:11

首先,我们将数据集从wide传输到long,然后进行计算和筛选,最后将其转换回wide格式。

代码语言:javascript
复制
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

数据

代码语言:javascript
复制
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

代码语言:javascript
复制
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-17
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55117412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档