Преобразование строки в числовой
Я импортировал тестовый файл и попытался сделать гистограмму
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"]
Тем не менее, я все еще получаю очень высокие цифры, у кого есть идея?
Ответы
Ответ 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
Это большое улучшение, но не всегда узкое место. Это важно, однако, если у вас есть большой кадр данных и много столбцов для преобразования.