Преобразовать фактор в столбец в числовой R

Я ввожу набор данных с помощью следующей команды:

rbc <- read.csv("rbc hgb.csv", header = T)
data <- rbc[rbc$Result_Value_After != "NULL",]

По какой-то причине rbc$Result_Value_After рассматривается как фактор, поэтому я запускаю следующую команду:

data$Result_Value_After <- as.numeric(data$Result_Value_After)

Строка (данные) говорит мне, что столбец теперь имеет тип num, но все числа, которые были факторами, представлены в десятичной форме, например 7.2. Когда я делаю преобразование, оно меняется на 72, что далеко. Любые идеи о том, как это исправить?


person MCP_infiltrator    schedule 02.05.2014    source источник
comment
Также в read.csv вы можете добавить аргумент as.is=T, и это предотвратит преобразование в фактор   -  person ZRoss    schedule 03.05.2014


Ответы (1)


Вот возможное решение проблемы классификации столбцов при вызове read.csv.

Скажем, я не хочу возиться с изменением классов после чтения данных в R. Если я хочу, чтобы один столбец был character, а остальные — классом по умолчанию, я могу использовать readLines для быстрого чтения первой строки . csv (т. е. строку заголовка столбца, если она есть) и настройте вектор, который будет передаваться в аргумент colClasses функции read.csv.

Вот простая функция,

col.classes <- function(csv, col, class){
    g <- readLines(csv, n = 1)
    n <- unlist(strsplit(g, ","))
    col.classes <- ifelse(n %in% col, class, NA)
    return(col.classes)
}

Чтобы показать, как это работает, предположим, что у меня есть файл с именем cats.csv (так получилось, что он у меня есть), и я знаю, что хочу, чтобы столбец weight был класс character и остальные столбцы в качестве класса по умолчанию. Имейте в виду, что colClasses может быть вектором символов, и для элементов, которые являются NA, соответствующий столбец данных пропускается и классифицируется, как если бы он был прочитан без colClasses.

Просмотр имен столбцов в файле

names(read.csv('cats.csv'))
## [1] "cats"   "colour" "length" "weight" "mu" 

Посмотреть классы по умолчанию от read.csv

> sapply(read.csv('cats.csv'), class)
##      cats    colour    length    weight       mu 
## "integer"  "factor" "integer" "integer" "integer" 

Прогоны образцов:

(1) Классифицировать столбец length как numeric при вызове read.csv, оставляя другие значения по умолчанию.

> cc1 <- col.classes('cats.csv', 'length', 'numeric')
> rr1 <- read.csv('cats.csv', colClasses = cc1)
> sapply(rr1, class)
## cats    colour    length    weight       mu 
## "integer"  "factor" "numeric" "integer" "integer" 

(2) Аналогичным образом классифицируйте столбец weight как character.

> cc2 <- col.classes('cats.csv', 'weight', 'character')
> rr2 <- read.csv('cats.csv', colClasses = cc2)
> sapply(rr2, class)
## cats      colour      length      weight         mu 
## "integer"    "factor"   "integer" "character"   "integer" 

Не уверен, что это вам вообще поможет. Я нахожу это полезным, когда мне нужно смешать классы столбцов, которые в противном случае могли бы быть неуклюжими и разочаровывающими, чтобы изменить их после того, как данные уже загружены в R.

person Rich Scriven    schedule 03.05.2014
comment
Спасибо за пост и отличные примеры - person MCP_infiltrator; 03.05.2014