使用as.numeric函数后的NULL维度

时间:2013-11-26 12:04:52

标签: r

我有一个.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命令将其转换为矩阵时,也会发生这种情况。 有人可以帮助我解决问题,我该如何解决?

4 个答案:

答案 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 **