我有一个上面格式的数据文件 我把它加载到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
有谁知道为什么会这样?
答案 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
而非Na
或NaN
(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 ",