#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
выводит adata.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 для каждого), но я не верю, что это то, что вы хотите.