即使数组的大小相同,维数也不正确

时间:2015-01-06 17:20:21

标签: r csv matrix dimension

我一直在研究这个程序很多天,并决定今天重写它.... 但这个问题一直困扰着我。 我认为csm[1,]Prank[1,]具有相同的维度。 谁可以帮我解决这个问题?

Prank<-read.csv("result.csv")


nrP<-nrow(Prank)
ncP<-ncol(Prank)

csm<-matrix(0,nrP*3,ncP)
ccsm<-matrix(0,nrP*3,ncP)

nrC<-nrow(csm)
ncC<-ncol(csm)

nrP
[1] 30
ncP
[1] 144
nrC
[1] 90
ncC
[1] 144
Prank[1,]
  P1 P2 P3 P4 P5 P6 P7 P8 P9 P10 P11 P12 P13 P14 P15 P16 P17 P18 P19 P20 P21 P22 P23 P24 P25 P26 P27 P28 P29 P30 P31 P32
1  4  2  3  1  4  2  3  1  4   2   3   1   3   1   4   2   4   2   3   1   4   1   3   2   4   1   3   2   4   2   3   1
  P33 P34 P35 P36 P37 P38 P39 P40 P41 P42 P43 P44 P45 P46 P47 P48 P49 P50 P51 P52 P53 P54 P55 P56 P57 P58 P59 P60 P61
1   4   1   3   2   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  P62 P63 P64 P65 P66 P67 P68 P69 P70 P71 P72 P73 P74 P75 P76 P77 P78 P79 P80 P81 P82 P83 P84 P85 P86 P87 P88 P89 P90
1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
  P91 P92 P93 P94 P95 P96 P97 P98 P99 P100 P101 P102 P103 P104 P105 P106 P107 P108 P109 P110 P111 P112 P113 P114 P115
1   0   0   0   0   0   0   0   0   0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  P116 P117 P118 P119 P120 P121 P122 P123 P124 P125 P126 P127 P128 P129 P130 P131 P132 P133 P134 P135 P136 P137 P138
1    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
  P139 P140 P141 P142 P143 P144
1    0    0    0    0    0    0
csm[1,]
  [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 [59] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[117] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
csm[1,]<-Prank[1,]
csm[1,]
Error in csm[1, ] : incorrect number of dimensions

2 个答案:

答案 0 :(得分:2)

问题是Prank[1, ]是一个data.frame(即列表),所以当你尝试将它分配给csm的第一行时,它会产生意想不到的转换副作用{ {1}}到列表。此时,执行csm没有任何意义(列表具有单个维度)因此错误。

解决方案是在分配之前取消列出csm[1, ]

Prank[1, ]

答案 1 :(得分:1)

read.csv()返回一个data.frame,除非Prank的所有列都是数字,否则分配

csm[1,]<-Prank[1,]

会导致csm被强制转换为列表,因为Prank[1,]不是数字向量。您需要确保Prank[1,]是数字向量(即is.numeric(Prank[1,]))。

修改建议:看看data.frame(head(Prank)),很明显一列或多列不是数字。要在恶作剧中检查每个字段的类,可以使用

lapply(Prank,class)

sapply(Prank,class) 

如果Prank中的所有字段都是整数或数字,则可以通过

将它们全部强制转换为数字
Prank[] <- lapply(Prank,as.numeric)

如果并非所有字段都是数字,则您需要将问题字段强制转换为数字或
或者在分配之前从Prank(例如Prank$ProblemField <- NULL)删除违规字段。