将数据导入R时,数据未格式化为表格

时间:2016-02-02 12:12:50

标签: r dataframe read.table

我有以下制表符分隔的.txt文件,包含9796行:

https://www.dropbox.com/s/fnrbmaw8odm2rqs/Kommunale_N%C3%B8gletal.txt?dl=0

我想将文件读入R,但文件不是经典的表格格式。相反,每个感兴趣的变量有279行和16列,其中第一行定义变量名称,前两列定义市政名称和代码,以下14列定义1993 - 2006年的年份。每个变量由空行分隔。该文件包含35个变量。

我想将数据读入data.frame,但有一列用于市政名称,市政府代码和年份,以及35个变量中每一个的一列。

如果您不方便关注链接或更喜欢较小的样本,下面将说明数据集(2个变量和3年的观察结果):

Indbyggertal 1 januar
Københavns Kommune     101    466129    467253  471300
Frederiksberg Kommune  147    87173     87466   88002
Ballerup Kommune       151    45427     45293   45356

Andel 0-17-årige
Københavns Kommune     101    14.0      14.1    14.4
Frederiksberg Kommune  147    12.4      12.5    12.6
Ballerup Kommune       151    21.2      21.1    21.3

首选输出的前3行应如下所示:

Municipality name      Municipality code    Year    Indbyggertal 1 januar   Andel 0-17-årige    …   Ældreudg (netto) pr 65+/67+-årig
Københavns Kommune     101                  1993    466129                  14                      35350
Frederiksberg Kommune  147                  1993    87173                   12.4                    33701
Ballerup Kommune       151                  1993    45427                   21.2                    31126

1 个答案:

答案 0 :(得分:2)

可能有更多的方法可以做到这一点,但我在下面使用的技巧是以文本形式读取所有数据,然后确定新块开始的位置,最后遍历读取它们的所有块并将它们存储在list

lines <- readLines("Kommunale_Nøgletal.txt", encoding = "latin1")

# Find empty lines; these start a new block
start <- c(0, grep("^[\t]+$", lines))

# Read titles
headers <- lines[start + 1]
headers <- gsub("\t", "", headers)

# Determine beginnen and ending of data blocks
begin <- start + 2
end   <- c(start[-1]-1, length(lines))

# Read each of the data blocks into a list
data <- vector(mode = "list", length(headers))
for (i in seq_along(headers)) {
  block <- lines[begin[i]:end[i]]
  data[[i]] <- read.table(textConnection(block), sep="\t", na.strings=c("U","M","-"))
}
names(data) <- headers

在此之后设置每个数据集中的正确标头应该很简单,然后将其组合成一个data.frame可以使用rbind_all包中的dplyr来完成。下面是一个例子:

# Set columnnames in data
# Add variable name to data
for (i in names(data)) {
  names(data[[i]]) <- c("municipality", "code", paste0("Y", 1993:2006))
  data[[i]]$var = i
}

# Merge the different datasets into one data.frame
library(dplyr)
data <- rbind_all(data)

# Transpose the data
library(reshape2)
m <- melt(data, id.vars = c("municipality", "code", "var"))
res <- dcast(m, municipality + code + variable ~ var)

# Fix the year variable
names(res)[3] <- "year"
res$year <- as.numeric(gsub("Y", "", res$year))