【问题标题】:Matlab/R: Restructure data in R which was imported from MatlabMatlab/R:重组从 Matlab 导入的 R 中的数据
【发布时间】:2015-07-07 14:22:31
【问题描述】:

我在 matlab 中创建了一个小数据集,如下所示

并且可以在此处下载可重现的示例:https://www.dropbox.com/s/e2qssxd5pu0x6hn/TEST_DATA.mat?dl=0

我想做的是将此数据集导入 R 并对其进行重组。我发现 R.matlab 包很有帮助,并尝试了以下方法。

   # Import matlab file into R
    library(R.matlab)
    # Read in data from matlab file
    data_m <- readMat('TEST_DATA.mat')
    # convert this to data.frame
    df <- as.data.frame(data_m)

我得到的是以下data.frame:

df
                  TEST.DATA.1.1          TEST.DATA.2.1
ID                             2         4
YEAR            1990, 1991, 1992         2000, 2001
DATA      10, 20, 30, 71, 72, 73         55, 60, 0, 2, 4, 6
DATA.NAME                   Test         n1, n2, n3

正如这里的评论所建议的,str(df)的输出

'data.frame':   4 obs. of  2 variables:
 $ TEST.DATA.1.1:List of 4
  ..$ ID       : num [1, 1] 2
  ..$ YEAR     : num [1:3, 1] 1990 1991 1992
  ..$ DATA     : num [1:3, 1:2] 10 20 30 71 72 73
  ..$ DATA.NAME: chr [1, 1] "Test"
 $ TEST.DATA.2.1:List of 4
  ..$ ID       : num [1, 1] 4
  ..$ YEAR     : num [1:2, 1] 2000 2001
  ..$ DATA     : num [1:2, 1:3] 55 60 0 2 4 6
  ..$ DATA.NAME:List of 3
  .. ..$ :List of 1
  .. .. ..$ : chr [1, 1] "n1"
  .. ..$ :List of 1
  .. .. ..$ : chr [1, 1] "n2"
  .. ..$ :List of 1
  .. .. ..$ : chr [1, 1] "n3"

如何重组df 以便得到两个不同的data.frames,它们被ID 字段分割?

> ID2
  ID YEAR data.Test data.Test2
1  2 1990        10         71
2  2 1991        20         72
3  2 1992        30         73
> ID4
  ID YEAR data.n1 data.n2 data.n3
1  4 2000      55       0       4
2  4 2001      60       2       6

【问题讨论】:

  • 发布str(df) 的结果可能会有所帮助
  • 我用str(df)的输出编辑了问题
  • 尝试df1 = df$TEST.DATA.1.1df$TEST.DATA.2.1 作为开始然后df1 = cbind(df1$YEAR, df1$DATA) 最后names(df1)=...
  • matlab 发送的数据结构中好像缺少Test2
  • @mts 感谢您的建议。但是我在数据中有大约 400 个不同的 ID,它们应该被分成几个 data.frames。这只是一个缩短的(希望是)可重现的例子......

标签: r matlab import


【解决方案1】:

这似乎可行,不知道是否有更好的方法。

❥ data_m <- readMat('~/Downloads/TEST_DATA.mat')
❥ frame <- as.data.frame(data_m)
❥ first <- frame[,1]
❥ second <- frame[,2]
❥ f_clean <- data.frame(first$ID, first$YEAR, first$DATA)
❥ f_clean
  first.ID first.YEAR X1 X2
1        2       1990 10 71
2        2       1991 20 72
3        2       1992 30 73
❥ s_clean <- data.frame(second$ID, second$YEAR, second$DATA)
❥ s_clean
  second.ID second.YEAR X1 X2 X3
1         4        2000 55  0  4
2         4        2001 60  2  6

编辑:离开@mts 答案,我们可以执行以下操作:

❥ f2 <- frame[!rownames(frame) %in% 'DATA.NAME',]
❥ sapply(f2, function(x) data.frame(x))
$TEST.DATA.1.1
  ID YEAR DATA.1 DATA.2
1  2 1990     10     71
2  2 1991     20     72
3  2 1992     30     73

$TEST.DATA.2.1
  ID YEAR DATA.1 DATA.2 DATA.3
1  4 2000     55      0      4
2  4 2001     60      2      6

【讨论】:

  • 因为 OP 有 400 个 ID,可能会遍历 frame 的最后一个维度并将输出存储在列表中?
猜你喜欢
  • 2012-07-25
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多