我有一个.csv文件。我已经用这个命令读了它:
data<-read.csv(filename, header=TRUE, sep=',')
数据如下所示:
> data[1:5,1:6]
X Group0 Group0.1 Group0.2 Group0.3 Group0.4
1 A 0 0 0 0 0
2 B 8 19 20 19 0
3 C 0 0 0 0 0
4 E 0 0 0 0 0
5 D 0 0 1 0 0
>
make<-data[,-1]
>dim(make)
> 1000 500
make<-as.matrix(make)
dim(make)
>1000 500
make<- as.numeric(make)
>dim(make)
NULL
当我将数据转换为数字时,它就会被破坏。维度变为NULL
。有时候,当我使用as.matrix
命令将其转换为矩阵时,也会发生这种情况。
有人可以帮助我解决问题,我该如何解决?
答案 0 :(得分:4)
导入数据和转换列是一个非常常见的问题,Llopis的答案很好。
我还认为有时候在传递中删除这些问题会更好:所以以正确的格式导入列。
所以这就像......
df= read.csv(filename, header=T, sep=' ', colClasses=c('factor', rep('numeric',5)))
如果您仍然需要数字data
矩阵,那么这只是
data=df[,2:6]
答案 1 :(得分:3)
dim
函数告诉你矩阵或数据框的维度,但是执行命令as.numeric
它会丢失这个矩阵结构,使其成为double类型的向量。因此,dim
无法返回维度的值,因为它不再是矩阵
要将每列转换为数字类型的数据,您可以使用以下(未经测试的)代码:
make <-apply(make, 1, as.numeric)
答案 2 :(得分:3)
在使用as.numeric
之前,只需保存矩阵的尺寸,然后使用dim<-
将这些属性分配回矢量。这将非常快,因为它使用完全矢量化的原始操作。
m <- matrix( sample(20) , 5 )
x <- dim(m)
#[1] 5 4
m <- as.numeric(m)
[1] 10 7 13 16 20 18 5 17 9 3 4 6 12 2 14 11 15 8 19 1
dim(m) <- x
# [,1] [,2] [,3] [,4]
#[1,] 10 18 4 11
#[2,] 7 5 6 15
#[3,] 13 17 12 8
#[4,] 16 9 2 19
#[5,] 20 3 14 1
答案 3 :(得分:0)
我遇到了类似的问题,在我读到别处(http://r.789695.n4.nabble.com/how-to-avoid-a-subset-of-a-matrix-to-become-a-column-vector-td2231926.html)之后,它建议添加一个drop = F来保留原始矩阵的“形状”。只是认为这可能是相关的,因为我在这些页面上搜索时也偶然发现:
>A=matrix(c(0,0,1,0,0,1.5,1,1.5,2,2,2,2.3),4,3,byrow=T)
>A
[,1] [,2] [,3]
[1,] 0 0.0 1.0
[2,] 0 0.0 1.5
[3,] 1 1.5 2.0
[4,] 2 2.0 2.3
> (A[A[,1]==1,-1])
[1] 1.5 2.0
> as.matrix(A[A[,1]==1,-1,drop=F])
[,1] [,2]
[1,] 1.5 2
> as.matrix(A[A[,1]==1,-1])
[,1]
[1,] 1.5
[2,] 2.0
它甚至可以用于子集化并防止自动重新整形为列向量:例如
>B=matrix(c(0,0,1,0,0,2),2,3,byrow=T)
> B[B[,1]==1,-1]
[1] 1.5 2.0
> B[B[,1]==1,-1,drop=F]
[,1] [,2]
[1,] 1.5 2
**它不适用于as.numeric **