我有文本格式的表格看起來像這樣:拆分不規則的文本轉換成表格
in.data <- rbind(
c("ColA KB Col C The ColE (2.0)"),
c("abc def ghijklm n opqrst"),
c("uv wx y zzzzzz aa bcd"),
c("ab cd gh jklmn")
)
,我需要它是這樣的:
wanted.result <- rbind(
c("abc", "def", "ghijklm", "n", "opqrst"),
c("uv", "wx y", "zzzzzz", "aa", "bcd"),
c("ab", "cd", NA, "gh", "jklmn")
)
colnames(wanted.result) <- c("ColA", "KB", "Col C", "The", "ColE (2.0)")
是什麼讓這個複雜的是,垂直分割符位置可以基於列名和列內容。
這裏是一個醜陋的嘗試的作品:
library(stringr)
spaces.1 <- unique(unlist(str_locate_all(in.data[1,], " ")))
spaces.2 <- unique(unlist(str_locate_all(in.data[2,], " ")))
spaces.3 <- unique(unlist(str_locate_all(in.data[3,], " ")))
spaces.4 <- unique(unlist(str_locate_all(in.data[4,], " ")))
spaces.12 <- spaces.1[spaces.1%in%spaces.2]
spaces.123 <- spaces.12[spaces.12%in%spaces.3]
spaces.1234 <- spaces.123[spaces.123%in%spaces.4]
for (i in length(spaces.1234):2) {
if (spaces.1234[i]-spaces.1234[i-1]==1) spaces.1234[i] <- NA_integer_
}
delimiters <- na.omit(spaces.1234)
library(data.table)
in.data.table <- data.table(in.data)
in.data.table[, col.1:=substr(V1, start=1, stop=delimiters[1])]
in.data.table[, col.2:=substr(V1, start=delimiters[1], stop=delimiters[2])]
in.data.table[, col.3:=substr(V1, start=delimiters[2], stop=delimiters[3])]
in.data.table[, col.4:=substr(V1, start=delimiters[3], stop=delimiters[4])]
in.data.table[, col.5:=substr(V1, start=delimiters[4], stop=37)]
setnames(in.data.table, as.character(in.data.table[1, ]))
wanted.result.2 <- in.data.table[2:4, 2:6, with=FALSE]
但我必須這樣做上千次,並伴有不同列和行的數量。
有沒有更好的方法來做到這一點,也適用於任何數量的行?
更新:爲了澄清,問題是根據標題和行中的空格位置查找寬度。對不起,不清楚這一點。
這個過程需要一個規則來確定何時以及有多少NA值來填寫。 –
這不僅僅是一個固定寬度的文本文件嗎? - 例如 - ''read.fwf'應該能夠應付它。 – thelatemail
我認爲read.fwf需要寬度,這些寬度在我的數據中是事先不知道的。 – Chris