Импорт CSV файла в R-числовые значения, считанные как символы
Мне известно, что на этом сайте есть похожие вопросы, однако ни один из них, похоже, не отвечает на мой вопрос достаточно.
Это то, что я сделал до сих пор:
У меня есть файл csv, который я открываю в excel. Я обрабатываю столбцы алгебраически, чтобы получить новый столбец "A". Я импортирую файл в R с помощью read.csv()
, а записи в столбце A хранятся в качестве факторов - я хочу, чтобы они были сохранены как числовые. Я нахожу этот вопрос по теме:
Импортировал csv-dataset в R, но значения становятся факторами
Следуя рекомендациям, я включаю stringsAsFactors = FALSE
в качестве аргумента в read.csv()
, однако, как указал Хун Оой на странице, приведенной выше, это не приводит к сохранению записей в столбце A в виде числовых значений.
Возможное решение - использовать рекомендации, приведенные на следующей странице:
Как преобразовать коэффициент в целое число\число без потери информации?
однако я хотел бы получить более чистое решение, то есть способ импортировать файл, чтобы записи записей столбцов были сохранены как числовые значения.
Приветствия за любую помощь!
Ответы
Ответ 1
Любая алгебра, которую вы делаете в Excel для создания нового столбца, возможно, будет более эффективно выполнена в R.
Попробуйте следующее: прочитайте исходный файл (перед любыми манипуляциями с excel) в R, используя read.csv(... stringsAsFactors=FALSE)
. [Если это не сработает, просмотрите ?read.table
(который read.csv
обертывает), однако может возникнуть какая-то другая основная проблема].
Например:
delim = "," # or is it "\t" ?
dec = "." # or is it "," ?
myDataFrame <- read.csv("path/to/file.csv", header=TRUE, sep=delim, dec=dec, stringsAsFactors=FALSE)
Затем скажем, что ваши числовые столбцы - столбец 4
myDataFrame[, 4] <- as.numeric(myDataFrame[, 4]) # you can also refer to the column by "itsName"
Наконец, если вам нужна помощь в выполнении R тех же задач, что и в Excel, здесь много людей, которые были бы рады помочь вам
Ответ 2
В read.table
(и его родственниках) аргумент na.strings
указывает, какие строки следует интерпретировать как отсутствующие значения NA
. Значение по умолчанию: na.strings = "NA"
Если отсутствующие значения в столбце числовой переменной в противном случае закодированы как нечто иное, чем "NA
", например. ".
" или "N/A
", эти строки будут интерпретироваться как character
, а затем весь столбец преобразуется в character
.
Таким образом, если ваши отсутствующие значения являются чем-то иным, чем "NA
", вам нужно указать их в na.strings
.
Ответ 3
Если вы имеете дело с большими наборами данных (например, с наборами данных с большим количеством столбцов), решение, упомянутое выше, может быть вручную громоздким и требует, чтобы вы знали, какие столбцы являются числовыми априори.
Попробуйте это вместо.
char_data <- read.csv(input_filename, stringsAsFactors = F)
num_data <- data.frame(data.matrix(char_data))
numeric_columns <- sapply(num_data,function(x){mean(as.numeric(is.na(x)))<0.5})
final_data <- data.frame(num_data[,numeric_columns], char_data[,!numeric_columns])
Код выполняет следующие действия:
- Импортирует ваши данные в виде столбцов символов.
- Создает экземпляр ваших данных в виде числовых столбцов.
- Определяет, какие столбцы из ваших данных являются числовыми (при условии, что столбцы с менее чем 50% НС при преобразовании ваших данных в числовые действительно являются числовыми).
- Объединение столбцов цифр и символов в конечный набор данных.
Это существенно автоматизирует импорт вашего CSV файла, сохраняя типы данных исходных столбцов (как символьные и числовые).
Ответ 4
Включение этого в команду read.csv
сработало для меня: strip.white = TRUE
(Я нашел это решение здесь.)
Ответ 5
версия для data.table на основе кода из dmanuge:
convNumValues<-function(ds){
ds<-data.table(ds)
dsnum<-data.table(data.matrix(ds))
num_cols <- sapply(dsnum,function(x){mean(as.numeric(is.na(x)))<0.5})
nds <- data.table( dsnum[, .SD, .SDcols=attributes(num_cols)$names[which(num_cols)]]
,ds[, .SD, .SDcols=attributes(num_cols)$names[which(!num_cols)]] )
return(nds)
}
Ответ 6
У меня была похожая проблема. Исходя из предположения Джошуа, что проблема была в excel, я посмотрел на нее и обнаружил, что числа отформатированы запятыми между каждой третьей цифрой. Переформатирование без запятых решило проблему.