2

我需要帮助阅读具有以下结构的未格式化变量名的文本数据文件:

     a_ID            =    259412258      494776
     a_SID            =     2081
     a_cor       =          434
     a_FAT          =        25000       50000       75000      100000
     125000      150000      175000      200000      225000      250000
     275000      300000      325000      350000      375000      400000
     425000      450000      475000      500000      525000      550000
     575000      600000      625000      650000      675000      700000
     725000      750000      775000      800000      825000      850000
     875000      900000      925000      950000      975000
     a_loc                 =   2147483647  2147483647   -73356703   -73355202
     -73353701   -73352130   -73350632   -73349210   -73347648   -73346229
     a_soc                  =   2147483647  2147483647   272263158   272261759
     272260359   272258876   272257473   272256153   272254668   272253346

每个变量的长度不等,并以 a_ 开头。按名称拉出某些变量的加分。不等长可以用NA填充。我试过扫描()

     x <- scan(file, what=list(NULL, name=character()))

它返回一个包含所有字符的列表。此外,x = read.table(file, header = T, sep = ",") 返回一个带有单个变量的数据框。我阅读了有关 rephape split 功能的信息,但我无法弄清楚如何在上述情况下使用它。任何帮助将不胜感激。

4

2 回答 2

1

这是一种可能的方法,在不假设换行的情况下进行了修改。它与原始版本几乎相同,但有几个额外的步骤:

首先,一些示例数据:

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
于 2013-08-25T04:09:07.400 回答
1

如果无名行中没有回车,那么很容易:

Lines <- readLines(textConnection("a_ID            =    259412258      494776
      a_SID            =     2081
      a_cor       =          434
      a_FAT          =        25000       50000       75000      100000       125000      150000      175000      200000      225000      250000      275000      300000      325000      350000      375000      400000      425000      450000      475000      500000      525000      550000      575000      600000      625000      650000      675000      700000     725000      750000      775000      800000      825000      850000     875000      900000      925000      950000      975000
      a_loc                 =   2147483647  2147483647   -73356703   -73355202      -73353701   -73352130   -73350632   -73349210   -73347648   -73346229
      a_soc                  =   2147483647  2147483647   272263158   272261759      272260359   272258876   272257473   272256153   272254668   272253346") )

slines <- strsplit(Lines, "=")

List <- vector("list", length(Lines))
install.packages('gdata')
names(List) <- gdata::trim(sapply(slines,"[", 1))
sapply(seq_along(List) , 
      function(items) List[[items]] <<- 
                      scan(textConnection(slines[[items]][2]) ) )

#--------------------------------
 List
$a_ID
[1] 259412258    494776

$a_SID
[1] 2081

$a_cor
[1] 434

$a_FAT
 [1]  25000  50000  75000 100000 125000 150000 175000 200000 225000 250000 275000 300000 325000 350000 375000
[16] 400000 425000 450000 475000 500000 525000 550000 575000 600000 625000 650000 675000 700000 725000 750000
[31] 775000 800000 825000 850000 875000 900000 925000 950000 975000

$a_loc
 [1] 2147483647 2147483647  -73356703  -73355202  -73353701  -73352130  -73350632  -73349210  -73347648
[10]  -73346229

$a_soc
 [1] 2147483647 2147483647  272263158  272261759  272260359  272258876  272257473  272256153  272254668
[10]  272253346
于 2013-08-25T04:32:43.490 回答