我能够在Python中执行此数据ETL工作。但是,因为我需要与R集成,而我是R的新手,所以我在这里发布问题。我想爆炸基于START_DATE日期和结束日期的日期,并做累积频率求和自变量“类型”虚拟变量在R中的日期累计总和
原始数据有3列与变量名日期,结束日期和导出虚拟变量类型
start_date, end_date, type
1/1/2016, 1/3/2016, A
1/2/2016, 1/2/2016, B
1/2/2016, 1/3/2016, A
这是我试图实现的解释。
对于记录的第一行,类型A每天从1/1到1/3出现(包括开始日期和结束日期)。
现在在第二行上,类型B只出现在1/2上。
到目前为止,1/1有一个'A',1/2有一个'A'和一个'B',1/3有一个'A'。
这样的过程重复其余的记录。实际上,我在变量“type”中有很多这样的行和很多不同的值
基本上,我需要一个有效的算法来为每天的变量“type”中的所有变量进行频率计数,以日期作为索引列的数据帧以及变量“type”中所有唯一变量的相应频率计数。希望澄清。
我需要与第一行中输入以下格式的数据帧作为新的头
date, A, B
1/1/2016, 1, 0
1/2/2016, 2, 1
1/3/2016, 2, 0
似乎如预期@ Tiffany的解决方案没有奏效。他/她的嵌套循环代码部分分解为我的下面的示例代码。
start_date end_date type
1/1/16 1/3/16 A
1/1/16 1/3/16 A
1/1/16 1/8/16 B
1/1/16 1/14/16 B
1/5/16 1/19/16 B
1/7/16 1/13/16 C
1/9/16 1/18/16 A
1/13/16 1/19/16 D
1/13/16 1/19/16 A
1/14/16 1/22/16 B
1/15/16 1/29/16 B
1/16/16 1/22/16 D
正确的部分是:
results <- data.frame(date = dates)
for(t in unique(df$type)) {
for(d in dates) {
results[results$date == d, t] <-
length(df[df$start_date <= d & df$end_date >= d & df$type == t],'type')
}
}
感谢提前的帮助。为了证明我不是在stackover流社会的精神懒散,这是Python版本,我写道:
import pandas as pd
df = pd.read_csv("dates.csv")
factor_type = list(df['type'].unique())
columns = ['date']
columns.extend(factor_type)
result = []
dates_dict = {}
i = 0
for index,row in df.iterrows():
start_end = pd.date_range(row['start_date'], row['end_date'])
factor = row['variable_type']
factor_index = factor_type.index(factor)
for x in start_end:
date_obj = x.date()
date_str = '%s/%s/%s' % (date_obj.month, date_obj.day,date_obj.year)
if date_str in dates_dict:
row_index = dates_dict[date_str]
result[row_index+1][factor_index+1]+=1
else:
dummy_row = [0]*len(factor_type)
dummy_row[factor_index]=1
result.append([date_str]+dummy_row)
dates_dict[date_str]=i+1
result_df = pd.DataFrame(result,columns=columns)
使用
dcast
转换到宽幅没有在你的Python代码仔细研读,你的输入和期望输出之间的映射关系不明确。请说明。 – MichaelChirico不应该'A'列在第二行有1?如果是这样,我认为以下是一个选项'library(data.table); dcast(唯一(熔化(setDT(df)[,indx:= .I],c(“type”,“indx”)),by = c(“indx”,“value”)),value_type) –
这里start_date和end_date都包含在计数中,换句话说,两端都是关闭间隔。 – Jin