2012-02-28 473 views
4

整数i有以下代码转换因子,以在数据帧

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 

我有同样的问题......

回答

11

随着anna.table(这是一个数据框,顺便提一下,一张表是别的!),最简单的方法就是这样做:

anna.table2 <- data.matrix(anna.table) 

as 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()直接应用于该因子相同,如第二个示例所示,该技巧不保留原始信息。

+0

@Anna您编辑的问题与以前几乎相同。我的答案包括使用'as.numeric()'。还有一个问题,我会相应地编辑我的答案。 – 2012-02-28 13:42:03

+0

非常感谢你......我如何使用as数字直接转换anna.total $分数?以下是否正确? new.score <-as.numeric(anna.total $分数)? – Anna 2012-02-28 13:45:01

+0

取决于 - 请参阅我编辑的答案。我没有'分数'或你的原始数据。很多将取决于文本文件的样子等等,以及你如何阅读它。 – 2012-02-28 13:53:26

4

我知道这是一个老问题,但我只是有同样的问题,可能是它帮助:

在这种情况下,你的分数列好像它不应该成为一个因素列。当它是一个文本列时,通常发生在read.table之后。取决于你来自哪个国家,也许你将浮游物与“,”分开,而不是与“。”分开。然后R认为这是一个字符列,并使其成为一个因素。在这种情况下,加文斯的回答将不起作用,因为R不会使“123,456”达到123.456。您可以在文本编辑器中轻松修复该问题,将“,”替换为“。”。虽然。

+1

或用'dec =“,”'读取数据,这就是该参数的用途。 – 2014-02-15 20:49:38