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

Импорт CSV файла в R-числовые значения, считанные как символы

Мне известно, что на этом сайте есть похожие вопросы, однако ни один из них, похоже, не отвечает на мой вопрос достаточно.

Это то, что я сделал до сих пор:

У меня есть файл csv, который я открываю в excel. Я обрабатываю столбцы алгебраически, чтобы получить новый столбец "A". Я импортирую файл в R с помощью read.csv(), а записи в столбце A хранятся в качестве факторов - я хочу, чтобы они были сохранены как числовые. Я нахожу этот вопрос по теме:

Импортировал csv-dataset в R, но значения становятся факторами

Следуя рекомендациям, я включаю stringsAsFactors = FALSE в качестве аргумента в read.csv(), однако, как указал Хун Оой на странице, приведенной выше, это не приводит к сохранению записей в столбце A в виде числовых значений.

Возможное решение - использовать рекомендации, приведенные на следующей странице:

Как преобразовать коэффициент в целое число\число без потери информации?

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

Приветствия за любую помощь!

4b9b3361

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