【发布时间】:2016-12-29 20:16:55
【问题描述】:
我能够在 Python 中完成这项数据 ETL 工作。但是,由于我需要与 R 集成并且我是 R 的新手,所以我在这里发布了这个问题。我想根据 start_date 和 end_date 分解日期,并对从变量“type”派生的虚拟变量进行累积频率求和
原始数据有 3 列,变量名为 start_date、end_date 和 type
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(包括开始日期和结束日期)。
现在在第 2 行,类型 B 仅出现在 1/2。
到目前为止,1/1 有一个“A”,1/2 有一个“A”和一个“B”,1/3 有一个“A”。
对其余记录重复此过程。实际上,我在变量“类型”中有很多这样的行和很多不同的值
基本上,我需要一个有效的算法来对变量“类型”中的所有变量进行频率计数,生成一个以日期为索引列的数据框,以及变量“类型”中所有唯一变量中的相应频率计数”。希望它澄清。
我需要以下格式的数据框,第一行作为新标题
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 flow 社区的精神上并不懒惰,这是我写的 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)
【问题讨论】:
-
如果不仔细研究您的 python 代码,您的输入和所需输出之间的映射就不清楚了。请详细说明。
-
不应该
A列在第二行有1吗?如果是这样,我认为下面是一个选项library(data.table) ; dcast(unique(melt(setDT(df)[, indx := .I], c("type", "indx")), by = c("indx", "value")), value ~ type) -
这里 start_date 和 end_date 都包含在计数中,也就是说,两端都是闭区间。
标签: r grouping dummy-variable