Read_csv удаляет букву «f» из конца строки

Я импортирую 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.

Я не могу это воспроизвести. Также обратите внимание, что cbind(x,y) — это символьная матрица, поэтому df имеет два символьных столбца. Используйте df <- data.frame(x, y)

G. Grothendieck 31.05.2024 15:52

Вы можете указать read_csv рассматривать этот столбец как символьное значение: read_csv("Desktop/names_test.csv", col_types =cols(x=col_character()))

MrFlick 31.05.2024 15:58

Я могу воспроизвести это. Я использую R 4.4.0 в Windows 11, версия 2.1.5.

Andrew Gustar 31.05.2024 16:00

Я воспроизвел проблему; (однако я меняю utils::write.csv() на reader::write_csv(), чтобы избежать проблем с разделителями, поскольку у меня французский язык). Мне интересно такое поведение. Основным элементом, вероятно, является то, что read_csv() определяет столбец как двойной.

VinceGreg 31.05.2024 16:03

У меня та же проблема с «1305L» — преобразуется в числовое значение. R интерпретирует L как целочисленный индикатор, поэтому мне интересно, является ли f индикатором чего-то (возможно, индикатором с плавающей запятой в модуле Cpp где-то в readr)??

Andrew Gustar 31.05.2024 16:11

Это кажется очень близким к моему недавнему вопросу о преобразовании строк типа "XXXe"; см. hypatia.math.ethz.ch/pipermail/r-help/2024-May/479282.html

Carl Witthoft 31.05.2024 16:49

Ну и дела, вы действительно нашли то, о чем я (тоже) не знал или не сталкивался. @MrFlick уже показал, как принудительно прочитать данные для символа (а затем взять их оттуда). Часто забывают о функции str(), которая иногда может дать вам подсказку... Если вы запустите read_csv("Desktop/names_test.csv") |> str() и readr::read_csv("Desktop/names_test.csv") |> str(), вы также увидите, что чтение типов данных столбцов интерпретируется по-разному. Так... да... Наверное, это особенность!

Ray 31.05.2024 20:15

Предложение @MrFlick помогло решить эту проблему.

tjr 03.06.2024 15:25

У меня только что была такая же проблема. Я читал серию файлов в цикле, например: 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()) решает проблему.

geoscience123 03.06.2024 19:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
9
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Другие вопросы по теме