当前情况涉及保存在目录中的多个.txt数据文件。这些文件的长度不相等,并且每个文件由几个列名组成。这些文件具有“ id”列,但其余的列名称是不同的。作为示例,让我们考虑以下小场景df1和df2作为目录中的数据文件:
df1<-
structure(
list(id = c(1L, 2L, 3L, 4L),
a1=c(10L, 6L, 2L, 8L),
a2 = c(22L, 7L, 5L, 1L),
a3 = c(3L, 12L, 1L, 5L)),
.Names = c("id", "a1", "a2","a3"),
class = "data.frame",
row.names = c(NA,-4L))
df2<-structure(
list(id = c(1L, 2L, 3L),
b1=c(8L, 5L, 4L),
b2 = c(7L, 10L, 11L),
b3 = c(6L, 2L, 1L)),
.Names = c("id", "b1", "b2","b3"),
class = "data.frame",
row.names = c(NA,-3L))
我打算做的是基于某些选定的列名称对每个数据进行子集化,对于df1说“ a1”和“ a2”,对于df2说“ b1”和“ b2”。
我尝试了以下代码:
set(".../")
df1<-read.table("df1.txt", header=T)
df2<-read.table("df2.txt", header=T)
new.df1<-data.frame(df1$a1,df1$a2)
new.df2<-data.frame(df1$b1,df1$b2)
我担心的是,这种方法效率较低,因为有许多数据文件每个变量都很多,这意味着我不得不重复上述几行代码。有没有一种方法可以循环浏览目录,以根据相关的列名对每个数据进行子集化?非常感谢您的帮助。
答案 0 :(得分:1)
根据我对您的问题的了解,这就是我将如何尝试解决的问题。虽然仅当您的列始终在同一索引中或在所有表中共享相同的名称时,它才起作用。
library(data.table)
# recover file names
list_file <- list.files("path_to_your_files")
# loop over your files, recover only selected columns
list_df <- lapply(list_file, function(x){
#If your column names are always the same
fread(x, select = c("a1","a2"))
#If your column names are always in the same order
#fread(x, select = c(1,2))
})
您应该恢复的是一个列表,其中包含所有表的子集。