Преобразовать коэффициент в целое число во фрейме данных - PullRequest
4 голосов
/ 28 февраля 2012

У меня есть следующий код

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, но не могу понять, как я могу ее использовать

Следовательно, не могли бы вы дать мне несколько советов?

заранее спасибо

С наилучшими пожеланиями Anna

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

опять у меня та же проблема ......

Ответы [ 2 ]

11 голосов
/ 28 февраля 2012

С 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() непосредственно к фактору, и, как показывает этот второй пример, он не сохраняет исходную информацию.

4 голосов
/ 24 октября 2012

Я знаю, что это старый вопрос, но у меня была такая же проблема, и, возможно, она помогает:

В этом случае ваш столбец оценок кажется, что он не должен был стать столбцом факторов. Это обычно происходит после read.table, когда это текстовый столбец. В зависимости от того, из какой вы страны, вы можете использовать отдельные плавающие буквы с ",", а не с ".". Тогда R думает, что это символьный столбец и делает его фактором. И в этом случае ответ Гевинса не сработает, потому что R не сделает «123,456» по 123,456. Вы можете легко исправить это в текстовом редакторе, заменив "," на "." хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...