我正在尝试将一个Matlab文件导入到R中进行一些分析。 matlab文件是概率值的3D位置数组。所以,它是横跨z"切片的二维(x,y)矩阵。我想做的是将其转换为具有"位置"的R文件。然后报告概率值。所以下面的内容作为输出:
Prob x y z
0.17 1 1 1
0.28 1 1 2
0.35 2 1 1
0.40 2 1 2
0.16 1 2 1
0.27 1 2 2
0.34 2 2 1
0.80 2 2 2
当我使用R.matlab包时,我可以导入数据,它似乎导入正常,但我似乎无法获得"尺寸"数据或将其划分为不同的矩阵...或者真正做任何有用的事情但是它看起来像一个很长的列表"值为行*列*切片的长度。
下面是一些示例代码:
Matlab代码
x = rand(3,4,2)
save file.mat x
R代码
Tdata <- readMat("file.mat")
head(Tdata)
str(Tdata)
length(Tdata$x)
哪个输出
> str(Tdata)
List of 1
$ x: num [1:3, 1:4, 1:2] 0.026 0.330 0.222 0.631 0.567 ...
- attr(*, "header")=List of 3
..$ description: chr "MATLAB 5.0 MAT-file, Platform: GLNXA64, Created on: Mon Dec 5 17:45:33 2016 "
..$ version : chr "5"
..$ endian : chr "little"
> length(Tdata$x)
[1] 24
因此,它显示Tdata是一个包含三维数组的单个元素列表,每个维度都是正确的,并且它具有正确的值总数,但我似乎无法将这些列表中的任何一个分开或使用length()或dim()函数识别其尺寸。最初,我正在考虑使用类似下面的内容,但因为我无法获得它似乎无法工作的尺寸。
ndim <- dim(Tdata)
x_coord <- c(1:ndim[1])
y_coord <- c(1:ndim[2])
z_coord <- c(1:ndim[3])
new_df <- expand.grid(x_coord,y_coord,z_coord)
new_df <- cbind(new_df,Tdata$x)
任何帮助将不胜感激!
答案 0 :(得分:2)
对于显示的Tdata
对象,您可以使用Tdata$x
或Tdata[[1]]
访问数组。不幸的是,我不知道矩阵函数row
和col
的任何等价物。您可以使用一系列嵌套rep
- 调用来构建索引。
rows = rep( rep( 1:dim(arr)[1], each=dim(arr)[3] ), times=dim(arr)[2])
cols= rep( rep( 1:dim(arr)[1], each=dim(arr)[3] ), each=dim(arr)[2])
instances= rep( rep( 1:dim(arr)[1], times=dim(arr)[3] ), times=dim(arr)[2])
然后这会返回一个对象(希望如果在没有带有dput
的示例的情况下未经测试 - 输出。)
data.frame( Prob = Tdata$x, x=rows,y=cols, z=instances)
有一个功能可以生成包含唯一组合的行的数据帧,但是您需要使用可能看起来不那么直观的标签来调用它:
> expand.grid( z = 1:dim(arr)[1], x = 1:dim(arr)[2], y = 1:dim(arr)[3])
z x y
1 1 1 1
2 2 1 1
3 1 2 1
4 2 2 1
5 1 1 2
6 2 1 2
7 1 2 2
8 2 2 2
基于对问题误读的旧答案:
我的rd.txt
函数只是设置了read.table参数来读取带有标题的文本以生成数据帧(我在为text
创建read.table
- 参数之前创建了它) :
> arr <- array(NA, c(2,2,2) )
> df <- rd.txt("Prob x y z
+ 0.17 1 1 1
+ 0.28 1 1 2
+ 0.35 2 1 1
+ 0.40 2 1 2
+ 0.16 1 2 1
+ 0.27 1 2 2
+ 0.34 2 2 1
+ 0.80 2 2 2
+ ")
现在,使用矩阵索引方法来寻址数组中的位置(或更常见的是矩阵):
> arr[ as.matrix(df[-1]) ] <- df[[1]]
> arr
, , 1
[,1] [,2]
[1,] 0.17 0.16
[2,] 0.35 0.34
, , 2
[,1] [,2]
[1,] 0.28 0.27
[2,] 0.40 0.80
R,#,j,j格式也被R的稀疏矩阵矩阵包使用(都归功于Martin Maechler)。