我输入的数据包括主题ID列表和2个类别,以及实时和两个值。每个ID的实时值和值可以具有不同的长度。文件中有多个ID,每个ID有多个类别。
我在找到一个好的工具来更改数据文件时遇到了一些麻烦。我使用PostgreSQL提取数据和R进行分析,无法找到一个好的函数来帮助。有什么想法吗?我基本上想要将实时设置为30分钟而不是timesptamps,并将它们用作我的属性,将V1中的值用作实际值。但首先,我必须将时间间隔类别纳入我的数据。
输入:
ID CAT1 CAT2 realtime V1
21 23 51 11/2/3138 18:29 135
21 23 51 11/2/3138 18:58 132
21 23 51 11/2/3138 21:05 129
21 23 51 11/2/3138 21:05 130
21 23 51 11/2/3138 22:53 142
71 23 52 11/4/3138 6:47 66
71 23 52 11/4/3138 8:45 69
71 23 52 11/4/3138 8:45 68
输出:
ID || CAT1 || CAT2 || Interval 0 || Interval 1 || Interval 2 || Interval 3 || ...
21 || 21 || 23 || 135 || 132 || 130 || 142 || ...
71 || 23 || 52 || 66 || 69 || 68 || NULL || ...
我还写了一些关于连接数据的内容,这些内容并没有显示出非常有用,但如果你不同意,请告诉我:Perl + PostgreSQL-- Selective Column to Row Transpose
编辑::我愿意使用Weka或Matlab(如果存在) - 或者使用脚本语言来解决这个问题,但我希望在某处有一个函数/包...
答案 0 :(得分:1)
您只需将“实时”字符串转换为实际时间,然后从那里开始工作,例如除以间隔长度:
d$interval = floor(as.numeric(strptime(d$realtime,"%m/%d/%Y %H:%M"))/1800)
如果你想要字面上一个带有“Interval x”的变量,只需添加
d$interval = paste("Interval", d$interval - min(d$interval))
要创建长格式,请使用reshape
:
reshape(d[,names(d) != 'realtime'],idvar=c("ID","CAT1","CAT2"),timevar="interval",direction="wide")
但请注意,默认情况下,如果是重复项,则采用第一个匹配值;而在您的示例中,我认为您使用的是最后一个,因此您可能希望颠倒数据的顺序,如果这是情况下。
答案 1 :(得分:0)
要以非标准格式在 PostgreSQL 表中插入时间戳,您可以使用函数to_timestamp()
。
例如:
SELECT to_timestamp('11/2/3138 18:29', 'MM/DD/YYYY hh24:mi')
结果(以ISO 8601格式显示):
3138-11-02 18:29:00+01
要将时间戳截断为半小时精度,您可以使用date_trunc()
和date_part()
or extract()
功能。
例如:
SELECT date_trunc('hour', now())
+ CASE WHEN extract(minute from now()) > 29 THEN 30
ELSE 0 END * interval '1 min'