我有以下代码
anna.table<-data.frame (anna1,anna2)
write.table<-(anna.table, file="anna.file.txt",sep='\t', quote=FALSE)
我的表格最后包含的数字如下
chr start end score
chr2 41237927 41238801 151
chr1 36976262 36977889 226
chr8 83023623 83025129 185
依旧......
之后我试图只获得符合某些标准的值,例如得分低于特定值
所以我正在做以下
anna3<-"data/anna/anna.file.txt"
anna.total<-read.table(anna3,header=TRUE)
significant.anna<-subset(anna.total,score <=0.001)
Error: In Ops.factor(score, 0.001) <= not meaningful for factors
所以我猜问题是我的表有因子而不是整数
我猜我的anna.total $得分是一个因素,我必须使它成为一个整数
如果我读得正确,as.numeric可以解决我的问题
我正在阅读as.numeric函数,但我无法理解我如何使用它
因此,请你给我一些建议吗?
提前谢谢
最好的问候 安娜PS:我尝试了以下
anna3<-"data/anna/anna.file.txt"
anna.total<-read.table(anna3,header=TRUE)
anna.total$score.new<-as.numeric (as.character(anna.total$score))
write.table(anna.total,file="peak.list.numeric.v3.txt",append = FALSE ,quote = FALSE,col.names =TRUE,row.names=FALSE, sep="\t")
anna.peaks<-subset(anna.total,fdr.new <=0.001)
Warning messages:
1: In Ops.factor(score, 0.001) : <= not meaningful for factors
我再次遇到同样的问题......
答案 0 :(得分:11)
使用anna.table
(顺便说一下,这是一个数据框,表是其他东西!),最简单的方法就是:
anna.table2 <- data.matrix(anna.table)
因为data.matrix()
会将因子转换为其基础数字(整数)级别。这适用于只包含数字,整数,因子或其他可以强制转换为数字的变量的数据框,但任何字符串(字符)都会使矩阵成为字符矩阵。
如果您希望anna.table2
成为数据框,而不是矩阵,那么您可以随后执行以下操作:
anna.table2 <- data.frame(anna.table2)
其他选项是将所有因子变量强制转换为整数级别。这是一个例子:
## dummy data
set.seed(1)
dat <- data.frame(a = factor(sample(letters[1:3], 10, replace = TRUE)),
b = runif(10))
## sapply over `dat`, converting factor to numeric
dat2 <- sapply(dat, function(x) if(is.factor(x)) {
as.numeric(x)
} else {
x
})
dat2 <- data.frame(dat2) ## convert to a data frame
给出了:
> str(dat)
'data.frame': 10 obs. of 2 variables:
$ a: Factor w/ 3 levels "a","b","c": 1 2 2 3 1 3 3 2 2 1
$ b: num 0.206 0.177 0.687 0.384 0.77 ...
> str(dat2)
'data.frame': 10 obs. of 2 variables:
$ a: num 1 2 2 3 1 3 3 2 2 1
$ b: num 0.206 0.177 0.687 0.384 0.77 ...
但请注意,仅当您需要基础数字表示时,上述操作才有效。如果你的因子基本上是数字水平,那么我们需要更加清楚地将因子转换为数字,同时保留在关卡中编码的“数字”信息。这是一个例子:
## dummy data
set.seed(1)
dat3 <- data.frame(a = factor(sample(1:3, 10, replace = TRUE), levels = 3:1),
b = runif(10))
## sapply over `dat3`, converting factor to numeric
dat4 <- sapply(dat3, function(x) if(is.factor(x)) {
as.numeric(as.character(x))
} else {
x
})
dat4 <- data.frame(dat4) ## convert to a data frame
请注意我们在as.character(x)
之前需要先as.numeric()
。额外调用在将其转换为数字之前对级别信息进行编码。要了解其重要性,请注意dat3$a
是什么
> dat3$a
[1] 1 2 2 3 1 3 3 2 2 1
Levels: 3 2 1
如果我们只是将其转换为数字,我们会得到错误的数据,因为R转换基础代码
> as.numeric(dat3$a)
[1] 3 2 2 1 3 1 1 2 2 3
如果我们首先将因子强制转换为字符向量,然后转换为数字,我们保留原始信息而不是R的内部表示
> as.numeric(as.character(dat3$a))
[1] 1 2 2 3 1 3 3 2 2 1
如果您的数据与第二个示例类似,那么您就不能使用简单的data.matrix()
技巧,因为这与将as.numeric()
直接应用于因子相同,正如第二个示例所示,不保留原始信息。
答案 1 :(得分:4)
我知道这是一个较老的问题,但我遇到了同样的问题,可能会有所帮助:
在这种情况下,您的分数列似乎不应该成为因子列。这通常发生在read.table之后,当它是文本列时。根据您所在的国家/地区,可能是您使用“,”而不是“。”单独浮动。然后R认为这是一个字符列,并使其成为一个因素。在那种情况下,Gavins的回答是行不通的,因为R不会将“123,456”改为123.456。您可以在文本编辑器中轻松修复它,将“,”替换为“。”虽然。