2015-11-20 104 views
1

我很难找到重新排列数据集的方法。数据集具有以下形式:重新排列数据集与每季度的交易信息交易数据与每列交易一列

数据

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是(在1999年度Q1_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 

如何能重新排列我的数据,得到这样的结果?

回答

0

下面是使用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 
+1

是的!这解决了我的问题!非常感谢。 – tgrueter

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

希望它有帮助!

+0

不错的选择!但我认为你可以用'row.names(a)'替换'seq_len'' –

+1

可能是这样的'b = a [rep(row.names(a),$ Q1_1999 + a $ Q2_1999 + a $ Q3_1999) ,1:3]; b $ Quarter = paste(substr(b $ FirstFlight,1,4),b $ Id,sep ='。')' –

+0

@VeerendraGadekar非常感谢这两个输入。这几乎是我需要但不完全是。我认为“季度”变量应该有些误解。它应该显示相应季度的变量名称或类似的东西,可以提取季度的年份和数量。 – tgrueter