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

データがこの2番目の例のようである場合、それは因子に直接data.matrix()適用するのと同じであり、この2番目の例が示すように、元の情報を保持しないため、単純なトリックを使用することはできません。as.numeric()

于 2012-02-28T11:46:43.217 に答える
4

私はこれが古い質問であることを知っていますが、私は同じ問題を抱えていて、それが役立つかもしれません:

この場合、スコア列はファクター列になるべきではなかったようです。これは通常、テキスト列の場合、read.tableの後に発生します。出身国によっては、フロートを「。」ではなく「、」で区切る場合があります。次に、Rはそれを文字列と見なし、それを要因にします。そしてその場合、Rは「123,456」を123.456にしないので、Gavinsの答えは機能しません。「、」を「。」に置き換えると、テキストエディタで簡単に修正できます。けれど。

于 2012-10-24T09:02:52.820 に答える