4

我有以下代码

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$score 是一个因素,我必须使它成为一个整数

如果我没看错 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

我又遇到了同样的问题......

4

2 回答 2

12

使用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()直接应用于因子相同,并且正如第二个示例所示,这不会保留原始信息。

于 2012-02-28T11:46:43.217 回答
4

我知道这是一个较老的问题,但我也遇到了同样的问题,可能会有所帮助:

在这种情况下,您的分数列似乎不应该成为因子列。当它是一个文本列时,这通常发生在 read.table 之后。根据您来自哪个国家/地区,您可能会用“,”而不是“。”来分隔浮点数。然后 R 认为这是一个字符列并将其作为一个因素。并且在这种情况下,加文斯的回答将不起作用,因为 R 不会将 "123,456" 变为 123.456 。您可以在文本编辑器中使用“替换”轻松修复该问题。尽管。

于 2012-10-24T09:02:52.820 回答