我是R的新手,我正在尝试将名称,频率和性别三列的100个左右的txt文件加载到一个数据框中。这些文件都是名称“yob1990.txt”等。
我可以将所有文件都放到R中,但我不知道如何添加一年只有一年的专栏..有人可以帮忙吗?
答案 0 :(得分:1)
我会使用类似这样的工作流程,它假定(1)指定路径中的唯一.txt
文件是您想要读入的文件,以及(2)文件名中的唯一数字是这些年份的数字。
f <- list.files('path/to/files', patt='\\.txt$', full.names=TRUE)
# replace path above as required
d <- do.call(rbind, lapply(f, function(x) {
d <- read.table(x, header=TRUE) # add sep argument as required
d$Year <- as.numeric(gsub('\\D', '', basename(x)))
d
}))
f
将是您需要阅读的文件的完整路径向量。
lapply
依次考虑每个文件名(f
的每个元素),暂时将该文件名称为x
,并执行花括号之间的所有内容。
gsub('\\D', '', basename(x))
对basename(x)
执行“查找和替换”类型的操作(这是当前考虑的文件的文件名,不包括包含该文件的目录的结构)。我们查找所有非数字字符('\\D'
),并将其替换为空(''
)。我们将此gsub
操作的结果(即假设文件名中没有其他数字的年份)添加到data.frame的新Year
列。
最后,我们返回d
,一旦lapply
对f
中的所有文件执行了此过程,我们就会将它们与do.call(rbind, ...)
一起绑定。
答案 1 :(得分:1)
您还可以使用fread
中的rbindlist
和data.table
。如果文件在工作目录中,
f1 <- list.files(pattern="^yob.*\\.txt")
f1 #created 3 files
#[1] "yob1990.txt" "yob1991.txt" "yob1992.txt"
library(data.table)
library(stringr)
year <- as.numeric(str_extract(f1, perl("[0-9]+(?=\\.txt)")))
res <- rbindlist(Map(`cbind`, lapply(f1, fread), year=year))
head(res)
# Name Frequency Gender year
#1: Sam 24 Male 1990
#2: Gobi 22 Male 1990
#3: Rose 44 Female 1990
#4: Anita 35 Female 1990
#5: John 44 Male 1991
#6: Sofia 52 Female 1991
或者您可以使用unnest
tidyr
devtools::install_github("hadley/tidyr")
library(tidyr)
res1 <- unnest(setNames(lapply(f1, fread), year), year)
head(res1)
# year Name Frequency Gender
#1 1990 Sam 24 Male
#2 1990 Gobi 22 Male
#3 1990 Rose 44 Female
#4 1990 Anita 35 Female
#5 1991 John 44 Male
#6 1991 Sofia 52 Female