Я импортирую CSV с помощью read_csv. Данные выглядят так:
x <- rep("1306f",5)
y <- sample(1:10, 5)
df <- cbind(x,y)
df<-as.data.frame(df)
write.csv(df, "Desktop/names_test.csv")
Когда я импортирую это с помощью temp<-read_csv("Desktop/names_test.csv"), первый столбец имеет значение «1306». Когда я импортирую с помощью temp<-read.csv("Desktop/names_test.csv), я получаю «1306f», как и ожидалось.
Если последняя буква не одинакова в каждой строке, вот так:
x <- c("1306c","1306d","1306e","1306f","1306g")
y <- sample(1:10, 5)
df <- cbind(x,y)
df<-as.data.frame(df)
write.csv(df, "Desktop/names_test.csv")
Я получаю ожидаемые значения в первом столбце при импорте с помощью read_csv, включая букву «f». Это происходит только с этой буквой (т.е. если последняя буква всегда c, я получаю ожидаемое).
Есть предположения? Очевидно, я могу просто использовать read.csv, но надеюсь остаться с tidyverse.
Вы можете указать read_csv рассматривать этот столбец как символьное значение: read_csv("Desktop/names_test.csv", col_types =cols(x=col_character()))
Я могу воспроизвести это. Я использую R 4.4.0 в Windows 11, версия 2.1.5.
Я воспроизвел проблему; (однако я меняю utils::write.csv() на reader::write_csv(), чтобы избежать проблем с разделителями, поскольку у меня французский язык). Мне интересно такое поведение. Основным элементом, вероятно, является то, что read_csv() определяет столбец как двойной.
У меня та же проблема с «1305L» — преобразуется в числовое значение. R интерпретирует L как целочисленный индикатор, поэтому мне интересно, является ли f индикатором чего-то (возможно, индикатором с плавающей запятой в модуле Cpp где-то в readr)??
Это кажется очень близким к моему недавнему вопросу о преобразовании строк типа "XXXe"; см. hypatia.math.ethz.ch/pipermail/r-help/2024-May/479282.html
Ну и дела, вы действительно нашли то, о чем я (тоже) не знал или не сталкивался. @MrFlick уже показал, как принудительно прочитать данные для символа (а затем взять их оттуда). Часто забывают о функции str(), которая иногда может дать вам подсказку... Если вы запустите read_csv("Desktop/names_test.csv") |> str() и readr::read_csv("Desktop/names_test.csv") |> str(), вы также увидите, что чтение типов данных столбцов интерпретируется по-разному. Так... да... Наверное, это особенность!
Предложение @MrFlick помогло решить эту проблему.
У меня только что была такая же проблема. Я читал серию файлов в цикле, например: for(i in (unique(unique_files))){ind=ind+1 df = read_csv(paste0(getwd(),"/",i)) if (ind==1){df2 = df} if (ind>1){df2 = rbind(df2,df)}} где файлы содержат ячейки с данными типа «2A», «2B», ... «2F» в столбце. Когда были прочитаны ячейки, оканчивающиеся на F, L или S, буква отбрасывалась и просто возвращалось число перед ней, в результате чего получалось что-то вроде: «3A», «3B», «3C», «3D», « 3Е», «3», «3G». Добавление col_types = cols(UNIT=col_character()) решает проблему.





readr предполагает, что столбец должен быть символьного типа, поэтому решение состоит в том, чтобы более точно указать, каким должен быть тип столбца. Есть довольно много способов сделать это в зависимости от того, что вам нужно, и я бы посоветовал посмотреть страницу справки read_csv() и страницу справки cols()
x <- rep("1306f",5)
y <- sample(1:10, 5)
df <- data.frame(x,y)
write.csv(df, "names_test.csv")
library(readr)
simple <- read_csv("names_test.csv")
#> New names:
#> Rows: 5 Columns: 3
#> ── Column specification
#> ──────────────────────────────────────────────────────── Delimiter: "," dbl
#> (3): ...1, x, y
#> ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
#> Specify the column types or set `show_col_types = FALSE` to quiet this message.
#> • `` -> `...1`
# readr is 'guessing' the column should be a double
spec(simple)
#> cols(
#> ...1 = col_double(),
#> x = col_double(),
#> y = col_double()
#> )
explicit <- read_csv("names_test.csv", col_types = cols(x = col_character()))
#> New names:
#> • `` -> `...1`
spec(explicit)
#> cols(
#> ...1 = col_double(),
#> x = col_character(),
#> y = col_double()
#> )
explicit
#> # A tibble: 5 × 3
#> ...1 x y
#> <dbl> <chr> <dbl>
#> 1 1 1306f 5
#> 2 2 1306f 8
#> 3 3 1306f 10
#> 4 4 1306f 2
#> 5 5 1306f 4
Created on 2024-07-02 with reprex v2.1.0
Я не могу это воспроизвести. Также обратите внимание, что
cbind(x,y)— это символьная матрица, поэтомуdfимеет два символьных столбца. Используйтеdf <- data.frame(x, y)