【问题标题】:Why is t() returning a 'vector'?为什么 t() 返回一个“向量”?
【发布时间】:2021-07-20 17:14:21
【问题描述】:

只是在 R 中尝试一些基本的矩阵代数,我得到了一些我不完全理解的奇怪结果。

所以,我的数据如下所示:

    Wt LvrWt Dose Y
1   176 6.5 0.88    0.42
2   176 9.5 0.88    0.25
3   190 9.0 1.00    0.56
4   176 8.9 0.88    0.23
5   200 7.2 1.00    0.23
6   167 8.9 0.83    0.32
7   188 8.0 0.94    0.37
8   195 10.0 0.98   0.41
9   176 8.0 0.88    0.33
10  165 7.9 0.84    0.38
11  158 6.9 0.80    0.27
12  148 7.3 0.74    0.36
13  149 5.2 0.75    0.21
14  163 8.4 0.81    0.28
15  170 7.2 0.85    0.34
16  186 6.8 0.94    0.28
17  146 7.3 0.73    0.30
18  181 9.0 0.90    0.37
19  149 6.4 0.75    0.46

这是我正在使用的代码:

# Creating the X matrix
Xmatrix <- subset(questionOneA, select = -c(Y))
Xmatrix <- matrix(Xmatrix)
Xmatrix <- sapply(Xmatrix, as.numeric)
is.numeric(Xmatrix)

# Transposing the x matrix
Xtranspose <- t(Xmatrix)
Xtranspose <- matrix(Xtranspose)
is.numeric(Xtranspose)

Xmatrix 的输出似乎是正确的:

V1 V2 V3
1   176 6.5 0.88
2   176 9.5 0.88
3   190 9.0 1.00
4   176 8.9 0.88
5   200 7.2 1.00
6   167 8.9 0.83
7   188 8.0 0.94
8   195 10.0 0.98
9   176 8.0 0.88
10  165 7.9 0.84
11  158 6.9 0.80
12  148 7.3 0.74
13  149 5.2 0.75
14  163 8.4 0.81
15  170 7.2 0.85
16  186 6.8 0.94
17  146 7.3 0.73
18  181 9.0 0.90
19  149 6.4 0.75

但是,Xtranspose 的输出对我来说似乎很奇怪:

    
V1
1   176.00
2   6.50
3   0.88
4   176.00
5   9.50
6   0.88
7   190.00
8   9.00
9   1.00
10  176.00
11  8.90
12  0.88
13  200.00
14  7.20
15  1.00
16  167.00
17  8.90
18  0.83
19  188.00
20  8.00
21  0.94
22  195.00
23  10.00
24  0.98
25  176.00
26  8.00
27  0.88
28  165.00
29  7.90
30  0.84
31  158.00
32  6.90
33  0.80
34  148.00
35  7.30
36  0.74
37  149.00
38  5.20
39  0.75
40  163.00
41  8.40
42  0.81
43  170.00
44  7.20
45  0.85
46  186.00
47  6.80
48  0.94
49  146.00
50  7.30
51  0.73
52  181.00
53  9.00
54  0.90
55  149.00
56  6.40
57  0.75

我期待一个 3 行 19 列的输出。这里发生了什么我不明白的事情?

任何帮助将不胜感激!

【问题讨论】:

  • 问题不是t,而是matrix

标签: r matrix vector


【解决方案1】:

只需检查每个步骤的输出,您将看到在此步骤之后矩阵变为“一列”矩阵:

Xtranspose <- matrix(Xtranspose)

这个函数创建一个矩阵。如果您看到矩阵函数的manual,您会看到它默认为nrow=1ncol=1

您的矩阵显然包含比 1x1 矩阵更多的元素,但创建矩阵并不是您此时真正想要做的,您只需确保 2您拥有的维结构是一个矩阵,as.matrix 更好。 (但没必要,它已经是一个矩阵了。)

虽然我会说,手册并没有很好地解释这个具体发生的事情。它没有明确说明如果你给 matrix() 一个矩阵作为输入数据,它的元素多于你想要的给定行数和列数,会发生什么。

虽然它确实这么说,但这可能适用于您的情况:

当强制一个向量时,它会产生一个单列矩阵,并将向量的名称(如果有的话)提升为矩阵的行名。

这也是你看到的。

【讨论】:

    【解决方案2】:

    您应该使用as.matrix 而不是matrix 来转换为矩阵,这也可以通过更少的步骤完成。

    Xmatrix <- subset(questionOneA, select = -Y)
    Xmatrix <- as.matrix(Xmatrix)
    Xtranspose <- t(Xmatrix)
    
    Xmatrix
    #    Wt LvrWt Dose
    #1  176   6.5 0.88
    #2  176   9.5 0.88
    #3  190   9.0 1.00
    #4  176   8.9 0.88
    #5  200   7.2 1.00
    #6  167   8.9 0.83
    #7  188   8.0 0.94
    #8  195  10.0 0.98
    #9  176   8.0 0.88
    #10 165   7.9 0.84
    #11 158   6.9 0.80
    #12 148   7.3 0.74
    #13 149   5.2 0.75
    #14 163   8.4 0.81
    #15 170   7.2 0.85
    #16 186   6.8 0.94
    #17 146   7.3 0.73
    #18 181   9.0 0.90
    #19 149   6.4 0.75
    
    Xtranspose
    
    #           1      2   3      4     5      6      7      8
    #Wt    176.00 176.00 190 176.00 200.0 167.00 188.00 195.00
    #LvrWt   6.50   9.50   9   8.90   7.2   8.90   8.00  10.00
    #Dose    0.88   0.88   1   0.88   1.0   0.83   0.94   0.98
    #           9     10    11     12     13     14     15     16
    #Wt    176.00 165.00 158.0 148.00 149.00 163.00 170.00 186.00
    #LvrWt   8.00   7.90   6.9   7.30   5.20   8.40   7.20   6.80
    #Dose    0.88   0.84   0.8   0.74   0.75   0.81   0.85   0.94
    #          17    18     19
    #Wt    146.00 181.0 149.00
    #LvrWt   7.30   9.0   6.40
    #Dose    0.73   0.9   0.75
    

    查看matrix(Xmatrix) 返回的内容:

    matrix(Xmatrix)
    
    #           [,1]      
    #[1,] Integer,19
    #[2,] Numeric,19
    #[3,] Numeric,19
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-15
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2013-11-30
      • 2022-01-24
      相关资源
      最近更新 更多