2012-02-28 490 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