为什么我的矩阵不是数字?

时间:2013-12-18 20:34:30

标签: r matrix

我有一个32X32矩阵,其中列和行代表每个NFL团队。跨越行显示平均表示该团队击败对手的数量(由列名称表示)。

我为每个团队创建了32个向量:

nfl_data <- read.csv(file="2012NFLScoresMatrixNoNames.csv", h=T)
colnames(nfl_data) <- NULL

ari_s <- nfl_data[1,]
atl_s <- nfl_data[2,]
.
.
.
was_s <- nfl_data[32,]

a <- rbind(c(ari_s),c(atl_s),c(bal_s),c(buf_s),c(car_s),c(chi_s),c(cin_s),
    c(cle_s),c(dal_s),c(den_s),c(det_s),c(grn_s),c(hou_s),c(ind_s),
    c(jac_s),c(kc_s),c(mia_s),c(min_s),c(ne_s),c(no_s),c(nyj_s),
    c(nyg_s),c(oak_s),c(phi_s),c(pit_s),c(sd_s),c(sea_s),c(sf_s),
    c(stl_s),c(tb_s),c(tn_s),c(was_s))

a_trans <- t(a)
x <- solve(a_trans)

这是我收到错误的地方:

  

solve.default(a_trans)出错:'a'必须是数字矩阵

> str(nfl_data)
'data.frame':   32 obs. of  32 variables:
$ : num  0 4 0 3 0 15 0 0 0 0 ...
$ : int  -4 0 0 0 4 0 0 0 -6 -6 ...
$ : num  0 0 0 0 0 0 -12.5 -8.5 -2 17 ...
$ : num  -3 0 0 0 0 0 0 -10 0 0 ...
$ : int  0 -4 0 0 0 1 0 0 5 22 ...
$ : num  -15 0 0 0 -1 0 0 0 -16 0 ...
$ : num  0 0 12.5 0 0 0 0 1.5 1 8 ...
$ : num  0 0 8.5 10 0 0 -1.5 0 3 22 ...
$ : num  0 6 2 0 -5 16 -1 -3 0 0 ...
$ : num  0 6 -17 0 -22 0 -8 -22 0 0 ...
$ : num  28 13 0 0 0 4 0 0 0 0 ...
$ : num  -14 0 0 0 0 -10.5 0 0 0 0 ...
$ : int  0 0 -30 -12 0 -7 0 0 0 -6 ...
$ : int  0 0 0 -7 0 20 0 -4 0 0 ...
$ : num  0 0 0 16 0 38 17 0 0 0 ...
$ : num  0 16 3 18 -6 0 22 23 0 21.5 ...
$ : num  3 0 0 -4.5 0 0 -4 0 0 0 ...
$ : num  -7 0 0 0 0 5 0 0 0 0 ...
$ : num  2 0 1 -15 0 0 0 0 0 -10 ...
$ : int  0 3 0 0 7 0 0 0 -3 10 ...
$ : num  -1 0 0 -0.5 0 0 0 0 0 0 ...
$ : num  0 34 19 0 -29 0 18 -14 1 0 ...
$ : num  0 3 35 0 11 0 24 3 0 22 ...
$ : num  21 13 -1 0 8 0 21 -1 10 0 ...
$ : int  0 0 0 0 0 0 -2 -4 3 12 ...
$ : num  0 24 0 0 26 0 7 1 0 9 ...
$ : num  -27 0 0 -33 -4 -6 0 0 -20 0 ...
$ : num  -17.5 0 0 -42 0 -25 0 0 0 0 ...
$ : num  -14 0 0 -3 0 17 0 0 0 0 ...
$ : int  0 -2 0 0 -6 0 0 0 6 8 ...
$ : num  0 0 0 -1 0 31 0 0 0 0 ...
$ : num  0 7 -3 0 8 0 7 -17 -8.5 0 ...

> str(a)
List of 1024
$ : num 0
$ : num 4
$ : num 0
$ : num 3
$ : num 0
$ : num 15
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num -28
$ : num 14
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num -3
$ : num 7
$ : num -2
$ : num 0
$ : num 1
$ : num 0
$ : num 0
$ : num -21
$ : num 0
$ : num 0
$ : num 27
$ : num 17.5
$ : num 14
$ : num 0
$ : num 0
$ : num 0
$ : int -4
$ : int 0
$ : int 0
$ : int 0
$ : int 4
$ : int 0
$ : int 0
$ : int 0
$ : int -6
$ : int -6
$ : int -13
$ : int 0
$ : int 0
$ : int 0
$ : int 0
$ : int -16
$ : int 0
$ : int 0
$ : int 0
$ : int -3
$ : int 0
$ : int -34
$ : int -3
$ : int -13
$ : int 0
$ : int -24
$ : int 0
$ : int 0
$ : int 0
$ : int 2
$ : int 0
$ : int -7
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num -12.5
$ : num -8.5
$ : num -2
$ : num 17
$ : num 0
$ : num 0
$ : num 30
$ : num 0
$ : num 0
$ : num -3
$ : num 0
$ : num 0
$ : num -1
$ : num 0
$ : num 0
$ : num -19
$ : num -35
$ : num 1
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num 0
$ : num 3
$ : num -3
$ : num 0
$ : num 0
  [list output truncated]
  - attr(*, "dim")= int [1:2] 32 32

我一遍又一遍地看着我是否有逗号或者是o而不是0,但我找不到任何东西。关于如何解决这个问题的任何建议?

2 个答案:

答案 0 :(得分:3)

对象a是一个列表,而不是矩阵或数据框。看看你的代码:

a <- rbind(c(ari_s),c(atl_s),c(bal_s),c(buf_s),c(car_s),c(chi_s),c(cin_s),
    c(cle_s),c(dal_s),c(den_s),c(det_s),c(grn_s),c(hou_s),c(ind_s),
    c(jac_s),c(kc_s),c(mia_s),c(min_s),c(ne_s),c(no_s),c(nyj_s),
    c(nyg_s),c(oak_s),c(phi_s),c(pit_s),c(sd_s),c(sea_s),c(sf_s),
    c(stl_s),c(tb_s),c(tn_s),c(was_s))

在这里,您为每个对象使用了c。如果省略c函数调用,a将是一个数据框,而不是常用列表。

一个小例子:

> x <- data.frame(a=1:2, b=0.4)
> x1 <- x[1,]
> x2 <- x[2,]

> str(rbind(c(x1), c(x2)))
List of 4
 $ : int 1
 $ : int 2
 $ : num 0.4
 $ : num 0.4
 - attr(*, "dim")= int [1:2] 2 2
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:2] "a" "b"

> str(rbind(x1, x2))
'data.frame':   2 obs. of  2 variables:
 $ a: int  1 2
 $ b: num  0.4 0.4

函数c将类data.frame的对象转换为类list的对象。

使用

可能更容易
solve(t(nfl_data))

由于nfl_data,数据框t将转换为矩阵。

答案 1 :(得分:3)

执行str(a)时的信息位是:

> str(a)
List of 1024
....

换句话说,a 列表,而不是矩阵。当用户试图反转其他类型的矩阵(逻辑和字符)时,错误消息'a' must be a numeric matrix中的“数字”限定符可以阻止人们抱怨。在您的情况下,错误消息表示:“您没有给我一个任何排序的矩阵。”

解决这个问题的最简单方法就是转置数据框:

solve(t(nfl_data))

使用t()会通过nfl_data强制功能将as.matrix()数据框转换为矩阵。为了更明确,如果您的数据可能包含因素,那么您可能希望通过data.matrix()转换自己,例如

solve(t(data.matrix(nfl_data)))

但无论哪种方式,都不需要手动剥离数据帧中的每个行向量,将这些行按行绑定然后进行转置。