R: Импортировать CSV с именами столбцов, которые содержат пробелы

Файл CSV выглядит так (изменено для краткости). Несколько столбцов имеют пробелы в своем названии, и R не может их отличить.

Alias;Type;SerialNo;DateTime;Main status; [...]
E1;E-70;781733;01/04/2010 11:28;8; [...]

Вот код, который я пытаюсь выполнить:

s_data <- read.csv2( file=f_name )
attach(s_data)

s_df = data.frame( 
                scada_id=ID,
                plant=PlantNo, 
                date=DateTime,
                main_code=Main status,
                seco_code=Additional Status,
                main_text=MainStatustext,
                seco_test=AddStatustext,
                duration=Duration)

detach(s_data)

Я также попытался подставить

main_code=Main\ status

и

main_code="Main status"

Ответы

Ответ 1

Если вы не укажете check.names=FALSE, R преобразует имена столбцов, которые не являются допустимыми именами переменных (например, содержат пробелы или специальные символы или начинаются с чисел) в действительные имена переменных, например. заменяя пробелы точками. Попробуйте names(s_data). Если вы сделаете, используйте check.names=TRUE, затем используйте одиночные обратные кавычки (`), чтобы окружать имена.

Я также рекомендовал бы использовать rename из пакета reshape.

s_data <- read.csv2( file=f_name )
library(reshape)
s_df <- rename(s_data,ID="scada_id",
               PlantNo="plant",DateTime="date",Main.status="main_code",
               Additional.status="seco_code",MainStatustext="main_text",
               AddStatustext="seco_test",Duration="duration")

Для того, что стоит, инструменты tidyverse (т.е. readr::read_csv) имеют противоположное значение по умолчанию; они не преобразуют имена столбцов, чтобы сделать их законными символами R, если вы явно не запросите его.

Ответ 2

Я считаю, что пробелы заменяются точками ". при импорте файлов CSV. Таким образом, вы должны написать, например. Main.status. Вы можете проверить, введя names(s_data), чтобы узнать, что такое имена.

Ответ 3

s_data <- read.csv( file=f_name , check.names=FALSE)