将包含每季度交易信息的数据集重新排列为每笔交易一列的交易数据

Rearrange dataset with transactions per quarter info to transactional data with one column for each transaction

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

数据

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

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

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,只需对其进行排序。

希望对您有所帮助!

这是一个使用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