【问题标题】:Rearrange dataset with transactions per quarter info to transactional data with one column for each transaction将包含每季度交易信息的数据集重新排列为每笔交易一列的交易数据
【发布时间】:2015-11-20 17:06:41
【问题描述】:

我很难找到重新排列数据集的方法。数据集的形式如下:

数据

a <- data.frame(Id = c("123Ba", "672Es"), 
                FirstFlight = c("1999-10-04","1999-10-05"), 
                EnrollmentMonth = c("1999-10","2000-10"), 
                Q1_1999 = c(3,0), 
                Q2_1999 = c(0,1), 
                Q3_1999 = c(0,1))

#     Id FirstFlight EnrollmentMonth Q1_1999 Q2_1999 Q3_1999 
#1 123Ba  1999-10-04         1999-10       3       0       0
#2 672Es  1999-10-05         2000-10       0       1       1

变量 Id 是每个乘客的唯一标识符,最后三个变量代表一年中的季度(Q1_1999 = 1999 年的第一季度)。该季度变量的值表示一个人在相应季度进行了多少次飞行。

我尝试做的是重塑数据集,以便为特定季度的乘客每次飞行获得一行。因此,对于 Quarter 变量中的每个条目,应该生成相同数量的行,并且需要添加一个该季度的新变量,以便识别进行单次飞行的季度......我希望它更清楚一点现在。

预期输出

b <- data.frame(Id = c("123Ba", "123Ba", "123Ba","672Es","672Es"), 
                Quarter = c("Q1_1999","Q1_1999","Q1_1999","Q2_1999", "Q3_1999"), 
                FirstFlight = c("1999-10-04","1999-10-04","1999-10-04","1999-10-05","1999-10-05" ), 
                EnrollmentMonth = c("1999-10","1999-10","1999-10","2000-10" ,"2000-10"))

#  Id    Quarter FirstFlight EnrollmentMonth
#1 123Ba Q1_1999  1999-10-04         1999-10
#2 123Ba Q1_1999  1999-10-04         1999-10
#3 123Ba Q1_1999  1999-10-04         1999-10
#4 672Es Q2_1999  1999-10-05         2000-10
#5 672Es Q3_1999  1999-10-05         2000-10

如何重新排列我的数据以获得此结果?

【问题讨论】:

    标签: r dplyr reshape


    【解决方案1】:
    q1= a[which(a$Q1_1999!=0),] #Select data for each quarter 
    q2= a[which(a$Q2_1999!=0),] 
    q3= a[which(a$Q3_1999!=0),]   
    
    q1=q1[rep(row.names(q1),q1$Q1_1999),1:4] #repeat by number of flights
    q1$Quarter='Q1_1999'  # Quarter Col. 
    #do same for q2 and q3.
    '''
    '''    
    final_data=rbind(q1,q2,q3)
    

    这样,您将在每个航班上都有一行,并在列中包含季度信息。累积数据acc。要ID,只需排序即可。

    希望对您有所帮助!

    【讨论】:

    • 不错!但我认为您可以将seq_len 替换为row.names(a)
    • 可能是这样的b = a[rep(row.names(a), a$Q1_1999+a$Q2_1999+a$Q3_1999), 1:3]; b$Quarter = paste(substr(b$FirstFlight, 1, 4), b$Id, sep = '.')
    • @VeerendraGadekar 非常感谢这两个输入。这几乎是我需要的,但不完全是。我认为对“Quarter”变量中应该包含的内容有一点误解。它应该显示来自各个季度的变量名称,或者可以从中提取年份和季度数的类似名称。
    • @VeerendraGadekar :查看第一篇文章中的更新
    • @tgrueter :我已经更新了解决方案。希望对您有所帮助!
    【解决方案2】:

    这是一个使用splitstackshape的选项

    library(splitstackshape)
    a$Quarter = apply(a, 1, function(x) toString(rep(names(x[4:6]), x[4:6])))
    cSplit(setDT(a), 'Quarter', ',', 'long')[,-(4:6), with = F]
    
    #      Id FirstFlight EnrollmentMonth Quarter
    #1: 123Ba  1999-10-04         1999-10 Q1_1999
    #2: 123Ba  1999-10-04         1999-10 Q1_1999
    #3: 123Ba  1999-10-04         1999-10 Q1_1999
    #4: 672Es  1999-10-05         2000-10 Q2_1999
    #5: 672Es  1999-10-05         2000-10 Q3_1999
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-15
      • 2018-10-03
      相关资源
      最近更新 更多