Подтвердить что ты не робот

Преобразование строки в числовой

Я импортировал тестовый файл и попытался сделать гистограмму

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t")   
hist <- as.numeric(pichman$WS)    

Тем не менее, я получаю разные значения из значений в моем наборе данных. Первоначально я думал, что это потому, что у меня был текст, поэтому я удалил текст:

table(pichman$WS)    
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]    

Тем не менее, я все еще получаю очень высокие цифры, у кого есть идея?

4b9b3361

Ответ 1

Я подозреваю, что у вас проблемы с факторами. Например,

> x = factor(4:8)
> x
[1] 4 5 6 7 8
Levels: 4 5 6 7 8
> as.numeric(x)
[1] 1 2 3 4 5
> as.numeric(as.character(x))
[1] 4 5 6 7 8

Некоторые комментарии:

  • Вы отмечаете, что ваш вектор содержит символы "Вниз" и "Нет данных". Что ожидать/хотите as.numeric делать с этими значениями?
  • В read.csv попробуйте использовать аргумент stringsAsFactors=FALSE
  • Вы уверены, что это sep="/t, а не sep="\t"
  • Используйте команду head(pitchman), чтобы проверить первые несколько строк ваших данных.
  • Кроме того, очень сложно догадаться, какова ваша проблема, когда вы не предоставляете данные. Минимальный рабочий пример всегда предпочтительнее. Например, я не могу запустить команду pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t"), так как у меня нет доступа к набору данных.

Ответ 2

Как сказал csgillespie. strAsAsFactors по умолчанию имеет значение TRUE, которое преобразует любой текст в коэффициент. Поэтому даже после удаления текста у вас все еще есть фактор в вашем кадре данных.

Теперь о преобразовании есть более оптимальный способ сделать это. Поэтому я поставил его здесь как ссылку:

> x <- factor(sample(4:8,10,replace=T))
> x
 [1] 6 4 8 6 7 6 8 5 8 4
Levels: 4 5 6 7 8
> as.numeric(levels(x))[x]
 [1] 6 4 8 6 7 6 8 5 8 4

Чтобы показать, что он работает.

Тайминги:

> x <- factor(sample(4:8,500000,replace=T))
> system.time(as.numeric(as.character(x)))
   user  system elapsed 
   0.11    0.00    0.11 
> system.time(as.numeric(levels(x))[x])
   user  system elapsed 
      0       0       0 

Это большое улучшение, но не всегда узкое место. Это важно, однако, если у вас есть большой кадр данных и много столбцов для преобразования.