答案 0 :(得分:1)
这可以在TERR数据功能中完成。我不知道您将Spotfire与TERR集成的舒适程度,例如这里有一个介绍视频(演示从大约7分钟开始):
https://www.youtube.com/watch?v=ZtVltmmKWQs
考虑到这一点,我在编写脚本时未加载任何库,因此它相当冗长而明确,但希望可以更轻松地逐步进行操作。我敢肯定,有一种更优雅的方法,并且有更好的方法可以使它灵活使用列名,但这只是一个开始。
您的输入将是一个数据表(dt,原始数据),输出将是一个新的数据表(dt.out,转换后的数据)。所有列名(和某些值)都在脚本中显式寻址(因此,如果更改它们将无法使用)。
#remove the []
dt$Values=gsub('\\[|\\]','',dt$Values)
#separate into two different data frames, one for time and one for temperature
dt.time=dt[dt$Description=='time',]
dt.temperature=dt[dt$Description=='temperature',]
#split the columns we want to separate into a list of vectors
dt2.time=strsplit(as.character(dt.time$Values),',')
dt2.temperature=strsplit(as.character(dt.temperature$Values),',')
#rearrange times
names(dt2.time)=dt.time$object
dt2.time=stack(dt2.time) #stack vectors
dt2.time$id=c(1:nrow(dt2.time)) #assign running id for merging later
colnames(dt2.time)[colnames(dt2.time)=='values']='time'
#rearrange temperatures
names(dt2.temperature)=dt.temperature$object
dt2.temperature=stack(dt2.temperature) #stack vectors
dt2.temperature$id=c(1:nrow(dt2.temperature)) #assign running id for merging later
colnames(dt2.temperature)[colnames(dt2.temperature)=='values']='temperature'
#merge time and temperature
dt.out=merge(dt2.time,dt2.temperature,by=c('id','ind'))
colnames(dt.out)[colnames(dt.out)=='ind']='object'
dt.out$time=as.numeric(dt.out$time)
dt.out$temperature=as.numeric(dt.out$temperature)
Gaia
答案 1 :(得分:0)
由于您在此处显示的所有示例行都恰好包含四个列表项,而您没有另外指定,因此我假设所有数据都符合此格式。
在这种假设下,使用RXReplace()
表达式函数将值分成几列会变得很琐碎,尽管有些混乱。
您可以创建四个计算列,每个列的表达式如下:
Int(RXReplace([values],"\\[([\\d\\-]+),([\\d\\-]+),([\\d\\-]+),([\\d\\-]+)]","\\1",""))
第三个参数"\\1"
确定要提取列表中的哪个数字。根据{{1}}函数的要求,反斜杠加倍(“转义”)。
请注意,此示例假定数字均为整数。如果您使用小数,则需要将正则表达式的每个“短语”调整为RXReplace()
,并且需要将表达式包装在([\\d\\-\\.]+)
中而不是Real()
中(如果您将这一部分省略掉,结果将是String类型,这可能会在稍后处理数据时引起混乱。
一旦您拥有了四列,就可以轻松进行数据透视。