使用read.csv()
后,我的文件内容看起来不是很复杂。我尝试了一些功能和步骤,但无法使其工作。以下是控制台中前几行的外观:
read.csv("TestR.csv", sep=",", header=T)
控制台输出:
FragebogenID.Datum.Uhrzeit.FragebogenNr.Standort.Befrager.Zweirad.Geschlecht.Alter.Bildung.PLZ.Ort.Land.VerweigererIn.VerweigererOut.Ausgangspunkt.Anreise.Aufenthaltsdauer.Radfahren.Wandern.Joggen.Spazierengehen.Pilze.Nationalparkveranstaltung.Tierbe ...
0001;08.06.19;11:01;1;Parkplatz Deffernik;Carina Kronschnabl;2;2;69;2;77736;Zell;Deutschland;;;3;4;5;1;4;5;3;3;2;2;;4;15:00;40;1;1;1;4;5;1;;1;;;;1;71;2;;;;;;;;;;;;;
0002;08.06.19;11:40;2;Parkplatz Deffernik;Carina Kronschnabl;2;1;44;5;;;Deutschland;4;4;;1;4;1;2;5;3;2;5;5;5;;2;11:45;25;1;11;6;1;;;;;;;;;;;;;;;;;;;;;Radwege schlechter beschildert kein Netz im Vergleich zum Sumava Nationalpark
0003;08.06.19;12:20;3;Parkplatz Deffernik;Carina Kronschnabl;2;1;62;6;93180;Deuerling;Deutschland;3;4;;2;1;3;1;4;1;4;4;5;5;;8;18:00;60;650;1;1;4;5;1;;1;;;;2;60;2;;;;;;;;;;;;;
0004;08.06.19;12:35;4;Parkplatz Deffernik;Carina Kronschnabl;4;2;34;7;81379;München;Deutschland;;;2;4;3;4;4;4;4;5;5;5;Schwimmen: 4;5;14:00;70;700;6;4;1;;3;;;;1;72;4;2;60;4;1;66;4;;;;;;;
0005;08.06.19;13:00;5;Parkplatz Deffernik;Carina Kronschnabl;4;2;37;7;94227;Zwiesel;Deutschland;;;1;4;1;1;1;1;1;3;2;4;;3;17:00;50;1000;11;4;1;;1;;;;1;39;4;;;;;;;;;;;;;
如果我理解正确,标题行(带有列名(的字段分隔符与下面的数据行不同。
因此,我建议采用逐步方法:
- 读取文件的第一行并分隔列名
- 读取整个文件,但第一行除外,使用
";"
作为字段分隔符 - 重命名数据帧的列
这是我使用首选工具会做的事情:
library(data.table)
library(magrittr)
# read header and separate
hdr <- fread("TestR.csv", sep = "", nrows = 1L, header = FALSE)[, V1] %>%
strsplit("\.") %>%
unlist() %>%
trimws()
# read data and rename columns
dat <- fread("TestR.csv", skip = 1L, header = FALSE, fill = TRUE) %>%
setnames(seq_along(hdr), hdr)
dat
FragebogenID Datum Uhrzeit FragebogenNr Standort Befrager Zweirad Geschlecht Alter Bildung PLZ 1: 1 08.06.19 11:01 1 Parkplatz Deffernik Carina Kronschnabl 2 2 69 2 77736 2: 2 08.06.19 11:40 2 Parkplatz Deffernik Carina Kronschnabl 2 1 44 5 NA 3: 3 08.06.19 12:20 3 Parkplatz Deffernik Carina Kronschnabl 2 1 62 6 93180 4: 4 08.06.19 12:35 4 Parkplatz Deffernik Carina Kronschnabl 4 2 34 7 81379 5: 5 08.06.19 13:00 5 Parkplatz Deffernik Carina Kronschnabl 4 2 37 7 94227 Ort Land VerweigererIn VerweigererOut Ausgangspunkt Anreise Aufenthaltsdauer Radfahren Wandern Joggen 1: Zell Deutschland NA NA 3 4 5 1 4 5 2: Deutschland 4 4 NA 1 4 1 2 5 3: Deuerling Deutschland 3 4 NA 2 1 3 1 4 4: München Deutschland NA NA 2 4 3 4 4 4 5: Zwiesel Deutschland NA NA 1 4 1 1 1 1 Spazierengehen Pilze Nationalparkveranstaltung Tierbe V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 1: 3 3 2 2 4 15:00 40 1 1 1 4 5 1 NA 1 NA NA 2: 3 2 5 5 5 NA 2 11:45 25 1 11 6 1 NA NA NA NA NA 3: 1 4 4 5 5 NA 8 18:00 60 650 1 1 4 5 1 NA 1 NA 4: 4 5 5 5 Schwimmen: 4 5 14:00 70 700 6 4 1 NA 3 NA NA NA 1 5: 1 3 2 4 3 17:00 50 1000 11 4 1 NA 1 NA NA NA 1 V40 V41 V42 V43 V44 V45 V46 V47 V48 V49 V50 V51 V52 V53 V54 1: NA 1 71 2 NA NA NA NA NA NA NA NA NA NA NA 2: NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 3: NA NA 2 60 2 NA NA NA NA NA NA NA NA NA NA 4: 72 4 2 60 4 1 66 4 NA NA NA NA NA NA NA 5: 39 4 NA NA NA NA NA NA NA NA NA NA NA NA NA V55 1: 2: Radwege schlechter beschildert kein Netz im Vergleich zum Sumava Nationalpark 3: 4: 5: V56 V57 1: NA NA 2: NA NA 3: NA NA 4: NA NA 5: NA NA
微调
还有一些微调可以避免空列标题并折叠字符列内的空格:
hdr <- fread("TestR.csv", sep = "", nrows = 1L, header = FALSE)[, V1] %>%
strsplit("\.") %>%
unlist() %>%
trimws() %>%
ifelse(. == "", paste0("V", seq_along(.)), .) # avoid empty column names
# read data and rename columns
dat <- fread("TestR.csv", skip = 1L, header = FALSE, fill = TRUE) %>%
setnames(seq_along(hdr), hdr)
# collapse white space
chr_cols <- names(dat)[sapply(dat, class) == "character"]
dat[, (chr_cols) := lapply(.SD, stringr::str_squish), .SDcols = chr_cols]
dat
FragebogenID Datum Uhrzeit FragebogenNr Standort Befrager Zweirad Geschlecht Alter Bildung PLZ 1: 1 08.06.19 11:01 1 Parkplatz Deffernik Carina Kronschnabl 2 2 69 2 77736 2: 2 08.06.19 11:40 2 Parkplatz Deffernik Carina Kronschnabl 2 1 44 5 NA 3: 3 08.06.19 12:20 3 Parkplatz Deffernik Carina Kronschnabl 2 1 62 6 93180 4: 4 08.06.19 12:35 4 Parkplatz Deffernik Carina Kronschnabl 4 2 34 7 81379 5: 5 08.06.19 13:00 5 Parkplatz Deffernik Carina Kronschnabl 4 2 37 7 94227 Ort Land VerweigererIn VerweigererOut Ausgangspunkt Anreise Aufenthaltsdauer Radfahren Wandern Joggen 1: Zell Deutschland NA NA 3 4 5 1 4 5 2: Deutschland 4 4 NA 1 4 1 2 5 3: Deuerling Deutschland 3 4 NA 2 1 3 1 4 4: München Deutschland NA NA 2 4 3 4 4 4 5: Zwiesel Deutschland NA NA 1 4 1 1 1 1 Spazierengehen Pilze Nationalparkveranstaltung Tierbe V26 V27 V28 V29 V30 V31 V32 V33 V34 V35 V36 V37 V38 V39 1: 3 3 2 2 4 15:00 40 1 1 1 4 5 1 NA 1 NA NA 2: 3 2 5 5 5 NA 2 11:45 25 1 11 6 1 NA NA NA NA NA 3: 1 4 4 5 5 NA 8 18:00 60 650 1 1 4 5 1 NA 1 NA 4: 4 5 5 5 Schwimmen: 4 5 14:00 70 700 6 4 1 NA 3 NA NA NA 1 5: 1 3 2 4 3 17:00 50 1000 11 4 1 NA 1 NA NA NA 1 V40 V41 V42 V43 V44 V45 V46 V47 V48 V49 V50 V51 V52 V53 V54 1: NA 1 71 2 NA NA NA NA NA NA NA NA NA NA NA 2: NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 3: NA NA 2 60 2 NA NA NA NA NA NA NA NA NA NA 4: 72 4 2 60 4 1 66 4 NA NA NA NA NA NA NA 5: 39 4 NA NA NA NA NA NA NA NA NA NA NA NA NA V55 V56 V57 1: NA NA 2: Radwege schlechter beschildert kein Netz im Vergleich zum Sumava Nationalpark NA NA 3: NA NA 4: NA NA 5: