Чтение файла csv, содержащего числа и строки в одном столбце

#r #csv

#r #csv

Вопрос:

Я импортирую CSV-файл с 3 столбцами. Последний столбец представляет собой серию записей, которые являются либо целым числом, либо строкой в кавычках.

Вот ряд примеров записей:

 1,4,"m"
1,5,20
1,6,"Canada"
1,7,4
1,8,5
  

Когда я импортирую это с помощью read.csv, все это просто превращается в факторы.

Как я могу настроить его так, чтобы они считывались как целые числа и строки?

Спасибо!

Комментарии:

1. Понял мою проблему. Похоже на ваше. Мой столбец содержал строки либо со строками, либо с целыми числами, как у вас. Строковые значения считывались как «», а целые числа считывались правильно. При размещении кавычек вокруг строки, как вы это делали, и вокруг целых чисел, каждое из них было правильно прочитано из csv. Я все еще не уверен в причине этого, но, похоже, сработало.

Ответ №1:

Это невозможно, поскольку данный вектор может иметь только один режим (например character , numeric , или logical ).

Однако вы можете разделить вектор на два отдельных вектора, один с числовыми значениями, а второй с символьными значениями:

 vec <- c("m", 20, "Canada", 4, 5)

vnum <- as.numeric(vec)
vchar <- ifelse(is.na(vnum), vec, NA)

vnum
[1] NA 20 NA  4  5

vchar
[1] "m"      NA       "Canada" NA       NA      
  

Комментарии:

1. Андри, ты сказал то же самое, что и я, но лучше.

2. @user718281, для чтения в виде строк, а не факторов, используйте read.csv(…,stringsAsFactors=FALSE)

3. Спасибо, Андри. Однако я не совсем уверен, как это сделать, — это как мне перейти от csv-файла к вектору. Насколько я понимаю, read.csv выводит матрицу, а не вектор.

4. read.csv выводит a data.frame . Существует несколько способов индексирования столбца (вектора) data.frame. Например, по номеру столбца: dat[, 3]

5. Андри, извините за невежество, но у меня это не работает. Когда я выполняю as.numeric в строке из фрейма данных, он выдает мне числа для каждого фактора, а не фактические целые числа. Вы знаете, как я мог бы это исправить?

Ответ №2:

РЕДАКТИРОВАТЬ Несмотря на решение OP принять этот ответ, ответ @Andrie является предпочтительным решением. Мой ответ предназначен только для информирования о некоторых странных особенностях фреймов данных.

Как указывали другие, короткий ответ заключается в том, что это невозможно. data.frame s предназначены для хранения столбцов одного атомарного типа. предложение @Andrie хорошее, но просто для пинки я подумал, что укажу способ включить этот тип данных в data.frame .

Вы можете преобразовать столбец-нарушитель в список (этот код предполагает, что вы установили options(stringsAsFactors = FALSE) ):

 dat <- read.table(textConnection("1,4,'m'
1,5,20
1,6,'Canada'
1,7,4
1,8,5"),header = FALSE,sep = ",")

tmp <- as.list(as.numeric(dat$V3))
tmp[c(1,3)] <- dat$V3[c(1,3)]
dat$V3 <- tmp

str(dat)
'data.frame':   5 obs. of  3 variables:
 $ V1: int  1 1 1 1 1
 $ V2: int  4 5 6 7 8
 $ V3:List of 5
  ..$ : chr "m"
  ..$ : num 20
  ..$ : chr "Canada"
  ..$ : num 4
  ..$ : num 5
  

Есть множество причин, по которым это плохая идея. Во-первых, многим кодам, которые, как вы ожидаете, будут хорошо работать с data.frame s, это не понравится, и они либо потерпят неудачу, либо будут вести себя очень странно. Но я подумал, что укажу на это как на любопытство.

Комментарии:

1. Как бы это ни было ужасно, я обсуждаю этику придумывания чего-то худшего. 🙂

2. Хм, на самом деле, это не воспроизводимо для меня. Значения V3 равны 5,1,4,2,3, а классы — int, num, int, num, num . Разрешение: options(stringsAsFactors = FALSE) .

3. @Iterator Спасибо, что напомнили мне; Я должен быть более осторожен при написании ответов SO в чистом сеансе R.

Ответ №3:

Нет. Фрейм данных представляет собой серию склеенных вместе векторов (список векторов или матриц). Поскольку каждый столбец является вектором, он не может быть классифицирован как целое число и фактор. Это должно быть одно или другое. Вы могли бы разделить вектор на числовые и множительные (acolumn для каждого), но я не верю, что это то, что вы хотите.