在数据未格式化为 table 时将数据导入 R
Importing data into R, when data isn't formatted as a table
我有以下包含 9796 行的制表符分隔的 .txt 文件:
https://www.dropbox.com/s/fnrbmaw8odm2rqs/Kommunale_N%C3%B8gletal.txt?dl=0
我想将文件读入 R,但是文件不是经典的 table 格式。相反,每个感兴趣的变量有 279 行和 16 列,其中第一行定义变量名称,前 2 列定义城市名称和代码,接下来的 14 列定义 1993-2006 年。每个变量由一个空行分隔。该文件包含 35 个变量。
我想将数据读入 data.frame
,但一列用于城市名称、城市代码和年份,35 个变量中的每一个都有一列。
如果您不喜欢table以下链接或更喜欢较小的样本,下面说明了数据集(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
可能有更多方法可以做到这一点,但我在下面使用的技巧是将所有数据作为文本读取,然后确定新块开始的位置,最后循环读取所有块并存储它们在 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
在每个数据集中设置正确的 headers 之后应该很简单,然后将其组合成一个 data.frame 可以使用 dplyr
中的 rbind_all
来完成包裹。下面是一个例子:
# 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))
我有以下包含 9796 行的制表符分隔的 .txt 文件:
https://www.dropbox.com/s/fnrbmaw8odm2rqs/Kommunale_N%C3%B8gletal.txt?dl=0
我想将文件读入 R,但是文件不是经典的 table 格式。相反,每个感兴趣的变量有 279 行和 16 列,其中第一行定义变量名称,前 2 列定义城市名称和代码,接下来的 14 列定义 1993-2006 年。每个变量由一个空行分隔。该文件包含 35 个变量。
我想将数据读入 data.frame
,但一列用于城市名称、城市代码和年份,35 个变量中的每一个都有一列。
如果您不喜欢table以下链接或更喜欢较小的样本,下面说明了数据集(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
可能有更多方法可以做到这一点,但我在下面使用的技巧是将所有数据作为文本读取,然后确定新块开始的位置,最后循环读取所有块并存储它们在 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
在每个数据集中设置正确的 headers 之后应该很简单,然后将其组合成一个 data.frame 可以使用 dplyr
中的 rbind_all
来完成包裹。下面是一个例子:
# 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))