【问题标题】:Changing values when converting column type to numeric将列类型转换为数值时更改值
【发布时间】:2011-06-13 09:39:32
【问题描述】:

我有一个上述格式的数据文件。
我将它加载到 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 

有人知道为什么会这样吗?

【问题讨论】:

  • 您能否粘贴dput(data) 的输出,以便我们重现您的结果。我的怀疑是您将factor 直接转换为numeric,这导致了问题。尝试用function(x) as.character(as.numeric(x)) 替换它,看看是否可行
  • @ Ramnath - 用 as.numeric(as.character(x)) 解决的问题
  • 看起来 R 将您的列分类为因素,因为您将标题作为行条目读取。在您的 read.table() 调用中设置 header = T 应该可以解决此问题。
  • @ricardh - 我从文本文件中删除了列并手动添加它们,可能不是最优雅的方式......但它有效。 colnames(chip_data)

标签: r


【解决方案1】:

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

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

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

附带说明,data 对于变量名来说是一个糟糕的(虽然不是无效的)选择,因为有一个同名的基本函数。

【讨论】:

  • @James:成功了。谢谢,我会考虑你的意见。
  • @Andra 我现在可以看到您的问题的格式稍微好一点,这是一个因素的一个原因是列名包含在数据中。您可能希望在读取数据的命令中添加 header=TRUE 参数。
  • @James- 我会记住的。 - 我从文本文件中删除了列并手动添加它们,可能不是最优雅的方式......但它有效。 colnames(chip_data)
  • 另见stackoverflow.com/q/3418128/210673as.numeric(levels(f))[f] 是一种更高效的替代方法。
【解决方案2】:

我有同样的问题,但我发现根本原因不同,所以我分享这个作为答案而不是评论。

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  ", 

【讨论】:

    【解决方案3】:

    当从 read.csv 读入对象 data 时,对于包含“列表”值的矩阵,我遇到了同样的问题。 as.character() 在这里不起作用,as.numeric()data.matrix() 更改了矩阵中的值。相反,您需要使用以下内容:

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

    首先转换为字符,然后转换为双精度。对于矩阵维度 data[m,n]。 (在赋值之前需要先创建对象matrix_numeric...matrix_numeric &lt;- matrix(0,m,n)

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

    out1 &lt;- as.numeric(unlist(vec1));

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-14
        • 2020-08-28
        • 2022-08-18
        • 2019-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        相关资源
        最近更新 更多