从R

时间:2017-01-20 20:10:12

标签: r for-loop time-series lapply wavelet

我是R的新手,我正在尝试从我的数据中获取小波函数的输出。我的数据结构为[152,90],来自90个变量的152个时间点。我想将每个时间序列(列)转换为小波。我能够获得1个时间序列的小波,并尝试遍历列并在不同的变量中获得我想要的4个不同输出。

data <- read.table(data.txt,sep = "\t")
rois <- seq(1,90,by = 1)
for ( i in 1:length(rois) ) {
a <- data[,i]
b <- wavMODWT(a, wavelet = "s14", n.levels = 4)
data1.d1[i] <- b$data$d1
data1.d2[i] <- b$data$d2
data1.d3[i] <- b$data$d3
data1.d4[i] <- b$data$d4
}

我希望这能为wavMODT函数的每个“d”输出提供一个152 x 90的矩阵/数据帧。我得到“data1 [i]&lt; -b $ data $ d1:object'data1'中找不到错误。我试图将data1设为空列表,但又出现了另一个错误”要替换的项目数不是替换项的倍数长度“。

另外,这是使用apply()函数的好时机,因为我试图在多列上应用函数吗?

非常感谢任何帮助。 谢谢

编辑:这是我的示例数据。该函数将列V1作为输入,并输出4个相同长度的列向量(b $ data $ 1到b $ data $ 4)。 wavMODWT函数位于包中:wmtsa

  V1       V2       V3       V4       V5       V6
1   1321.837 1353.712 1250.450 1183.120 1263.095 1298.410
2   1327.204 1360.711 1249.475 1181.297 1266.686 1294.568
3   1328.402 1362.084 1249.310 1177.071 1271.967 1295.823
4   1327.890 1366.335 1248.203 1173.392 1273.039 1295.118
5   1327.157 1370.059 1252.110 1177.771 1274.428 1300.177
6   1329.278 1370.950 1250.477 1177.238 1277.021 1294.408
7   1330.106 1363.459 1247.602 1176.267 1272.182 1296.256
8   1327.378 1364.607 1248.047 1178.523 1271.818 1293.098
9   1327.867 1363.442 1245.530 1175.825 1268.713 1295.788

1 个答案:

答案 0 :(得分:1)

由于wavMODWT会返回 wavTransform 类对象,因此我在docs页面的嵌入式R控制台中使用了此对象。

考虑使用lapply检索数据帧列表,每个数据帧包含4列系数向量。数据帧的数量等于您传入lapply的列数,特别是您的时间序列输入,因此N = 90:

data <- read.table(data.txt, sep = "\t")

# CREATING LIST OF DATA FRAMES
dfList <- lapply(seq(ncol(data)), function(s) { 
    W <- wavMODWT(s,  wavelet = "s14", n.levels = 4)  

    data.frame(list(d1=as.vector(W$data$d1)), 
               list(d2=as.vector(W$data$d4)), 
               list(d3=as.vector(W$data$d3)), 
               list(d4=as.vector(W$data$d4))) 
})

# NAMING EACH ELEMENT IN DF LIST TO CORRESPONDING COLUMN NAME
dfList <- setNames(dfList, colnames(data))

要遍历主题,请将另外lapply中的分配包裹在接收211个不同主题数据集作为输入的分配上,以最终输出211 dfLists 的列表,每个 dfLists 有90个数据帧!下面的示例假设从文本文件中检索数据。

datatxts <- list.files(path="/path/to/folder", pattern=".txt")

subjectsList <- lapply(datatxts, function(d) {

    dfList <- lapply(seq(ncol(d)), function(s) { ... })
    setNames(dfList, colnames(d))
})

subjectsList <- setNames(subjectsLists, gsub(".txt", "", datatxts))