将列类型转换为数字时更改值

时间:2011-06-13 09:39:32

标签: r

我有一个上面格式的数据文件 我把它加载到R中,并尝试使用dist列中的值绘制直方图,我得到错误“x必须是数字”。因此我尝试更改格式。

> head(data)

    V1        V2
1 type gene_dist
2    A     64667
3    A     76486
4    A     97416
5    A     30876
6    A     88018

> summary(data)
    V1            V2     
 A   : 67   100    :  1  
 B   :122   100906 :  1  
 type:  1   102349 :  1  
            1033   :  1  
            10544  :  1  
            10745  :  1  
            (Other):184  

我尝试使用sapply设置列的格式,但值已更改:

> data[,2]<-sapply(data[,2],as.numeric)

> head(data)
    V1  V2
1 type 190
2    A 146
3    A 166
4    A 189

summary(data)
    V1            V2        
 A   : 67   Min.   :  1.00  
 B   :122   1st Qu.: 48.25  
 type:  1   Median : 95.50  
            Mean   : 95.50  
            3rd Qu.:142.75  
            Max.   :190.00 

有谁知道为什么会这样?

4 个答案:

答案 0 :(得分:41)

看起来你的第二栏是一个因素。您需要在as.character之前使用as.numeric。这是因为因子在内部存储为带有表的整数,以给出因子级别标签。只使用as.numeric只会给出内部整数代码。没有必要使用sapply,因为这些函数是矢量化的。

data[,2] <- as.numeric(as.character(data[,2]))

列可能是一个因素,因为某些条目中有一些非数字字符。任何此类条目都会转换为NA,但会显示相应的警告,但您可能需要在原始数据中对此进行调查。

作为旁注,data是变量名称的一个差(尽管不是无效)选择,因为有一个同名的基函数。

答案 1 :(得分:0)

当从read.csv读入对象data时,我对包含'list'值的矩阵有同样的问题。 as.character()在此处不起作用,as.numeric()data.matrix()更改了矩阵中的值。相反,您需要使用以下内容:

matrix_numeric[1:m,1:n] <- as.numeric(as.matrix(data[1:m,1:n]))

首先转换为字符然后转换为double。对于矩阵维度数据[m,n]。 (您需要先创建对象matrix_numeric,然后再分配值... matrix_numeric <- matrix(0,m,n)

对于列表格式的向量vec1,我使用以下内容:

out1 <- as.numeric(unlist(vec1));

答案 2 :(得分:0)

在阅读文件时修复它比使用as.numeric()或as.character()要好得多。阅读文件时,请确保

  • header=TRUE如果第一行是标题
  • NA而非NaNaN(ctrl + H并在数据文件中替换为NA)
  • 数字列中没有其他字符串

然后R会自动将它们视为数字。

答案 3 :(得分:0)

我有同样的问题,但正如我发现的那样,根本原因是不同的,因此我将此作为答案而非评论分享。

df <- read.table(doc.csv, header = TRUE, sep = ",", dec = ".")
df$value

# Results in
[1]  2254    1873    2201    2147    2456    1785

# So..
as.numeric(df$value)
[1] 26 14 22 20 32 11

就我而言,原因是原始csv文档中的值存在空格。删除空格解决了问题。

来自dput(df)

" 1178  ", " 1222  ", " 1223  ", " 1314  ", " 1462  ",