这是一种可能的方法,在不假设换行的情况下进行了修改。它与原始版本几乎相同,但有几个额外的步骤:
首先,一些示例数据:
cat("a_ID = 259412258 494776",
"a_SID = 2081",
"a_cor = 434",
"a_FAT = 25000 50000 75000 100000 125000 150000 175000",
"25000 50000 75000 100000 125000 150000 175000",
"25000 50000 75000 100000 125000 150000 175000",
"a_loc = 2147483647 2147483647 -73356703 -73355202",
"a_soc = 2147483647 2147483647 272263158",
sep = "\n", file = "test.txt")
将这些行读入 R,进行一些处理,然后read.table
按照最初的建议进行:
X <- readLines("test.txt")
headers <- grepl("a_", X)
X[!headers] <- gsub("(.*)", " = \\1", X[!headers])
X <- read.table(text = X, sep = "=", strip.white = TRUE,
header = FALSE, stringsAsFactors=FALSE)
X
# V1 V2
# 1 a_ID 259412258 494776
# 2 a_SID 2081
# 3 a_cor 434
# 4 a_FAT 25000 50000 75000 100000 125000 150000 175000
# 5 25000 50000 75000 100000 125000 150000 175000
# 6 25000 50000 75000 100000 125000 150000 175000
# 7 a_loc 2147483647 2147483647 -73356703 -73355202
# 8 a_soc 2147483647 2147483647 272263158
将“V1”中的空白改为NA
,并使用na.locf
“zoo”填写。用于aggregate
将给定“V1”中的所有行粘贴在一起。
X$V1[X$V1 == ""] <- NA
library(zoo)
X <- na.locf(X)
X <- aggregate(V2 ~ V1, X, paste, collapse = " ")
添加新的分隔符,concat.split
用于分割数据。
X$V2 <- gsub("\\s+", "|", X$V2)
install.packages("splitstackshape")
library(splitstackshape)
Y <- concat.split(X, "V2", "|", drop = TRUE)
Y
# V1 V2_1 V2_2 V2_3 V2_4 V2_5 V2_6 V2_7 V2_8 V2_9
# 1 a_cor 434 NA NA NA NA NA NA NA NA
# 2 a_FAT 25000 50000 75000 100000 125000 150000 175000 25000 50000
# 3 a_ID 259412258 494776 NA NA NA NA NA NA NA
# 4 a_loc 2147483647 2147483647 -73356703 -73355202 NA NA NA NA NA
# 5 a_SID 2081 NA NA NA NA NA NA NA NA
# 6 a_soc 2147483647 2147483647 272263158 NA NA NA NA NA NA
# V2_10 V2_11 V2_12 V2_13 V2_14 V2_15 V2_16 V2_17 V2_18 V2_19 V2_20 V2_21
# 1 NA NA NA NA NA NA NA NA NA NA NA NA
# 2 75000 100000 125000 150000 175000 25000 50000 75000 100000 125000 150000 175000
# 3 NA NA NA NA NA NA NA NA NA NA NA NA
# 4 NA NA NA NA NA NA NA NA NA NA NA NA
# 5 NA NA NA NA NA NA NA NA NA NA NA NA
# 6 NA NA NA NA NA NA NA NA NA NA NA NA
t
如前所述,用于“转置” 。
Z <- setNames(data.frame(t(Y[-1])), Y[[1]])
Z
# a_cor a_FAT a_ID a_loc a_SID a_soc
# V2_1 434 25000 259412258 2147483647 2081 2147483647
# V2_2 NA 50000 494776 2147483647 NA 2147483647
# V2_3 NA 75000 NA -73356703 NA 272263158
# V2_4 NA 100000 NA -73355202 NA NA
# V2_5 NA 125000 NA NA NA NA
# V2_6 NA 150000 NA NA NA NA
# V2_7 NA 175000 NA NA NA NA
# V2_8 NA 25000 NA NA NA NA
# V2_9 NA 50000 NA NA NA NA
# V2_10 NA 75000 NA NA NA NA
# V2_11 NA 100000 NA NA NA NA
# V2_12 NA 125000 NA NA NA NA
# V2_13 NA 150000 NA NA NA NA
# V2_14 NA 175000 NA NA NA NA
# V2_15 NA 25000 NA NA NA NA
# V2_16 NA 50000 NA NA NA NA
# V2_17 NA 75000 NA NA NA NA
# V2_18 NA 100000 NA NA NA NA
# V2_19 NA 125000 NA NA NA NA
# V2_20 NA 150000 NA NA NA NA
# V2_21 NA 175000 NA NA NA NA