Matlab/R: 在 R 中重构从 Matlab 导入的数据

Matlab/R: Restructure data in R which was imported from Matlab

我在 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

这个好像可以,不知道有没有更好的方法。

❥ 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