通过相同的函数循环mutliple数据集以创建更多数据集

时间:2017-02-08 13:24:45

标签: r

我有16个数据集(名为A,B,C,D等),我从一个大数据集中进行了子集。为了节省时间和内存,我想在我的功能上进行构建,以便在创建我需要进一步分析的列车和测试数据集时一次性完成所有操作。

从csv文件读入后的日期集如下所示

#split the dataset into a list of datasets by year
Y <- split(dat, dat$year)
#split the list into separate datasets
A <- Y[[1]]
B <- Y[[2]]
C <- Y[[3]]
D <- Y[[4]]
E <- Y[[5]]
F <- Y[[6]]
G <- Y[[7]]
H <- Y[[8]]
I <- Y[[9]]
J <- Y[[10]]
K <- Y[[11]]
L <- Y[[12]]
M <- Y[[13]]
N <- Y[[14]]
O <- Y[[15]]
P <- Y[[16]]

以下是我的火车/测试数据集制作者

train_test<-data    
set.seed(501)    
ind=sample(2,nrow(data),replace=TRUE,prob=c(0.7,0.3))    
train=data[ind==1,]    
test=data[ind==2,]   
train_test<-data    
set.seed(501)    
ind=sample(2,nrow(data),replace=TRUE,prob=c(0.7,0.3))    
train=data[ind==1,]    
test=data[ind==2,]

我想做的就是...

for i = "A,B,C...
{   
train_test<-[i]    
set.seed(501)    
ind=sample(2,nrow([i]),replace=TRUE,prob=c(0.7,0.3))    
train[i]=[i][ind==1,]    
test[i]=data[i][ind==2,]    
}

我已经查看了stackoverflow,但似乎没有回答我的问题因此发布。

3 个答案:

答案 0 :(得分:3)

如果您的数据集位于命名列表中,则可以通过迭代列表名称来执行此操作:

names(Y)=LETTERS[1:16]    
set.seed(501)
test=list()
train=list()
for (i in names(Y)) {
    ind=sample(2,nrow(Y[[i]]),replace=TRUE,prob=c(0.7,0.3))    
    train[[i]]=Y[[i]][ind==1,]    
    test[[i]]=Y[[i]][ind==2,]
}

仍然没有检查,因为我没有你的数据集,但这应该有效。

答案 1 :(得分:0)

喜欢

lapply(X = Y, FUN = function(x) {
 set.seed(501)    
 ind=sample(2,nrow(x),replace=TRUE,prob=c(0.7,0.3))    
 train=x[ind==1,]    
 test=data[ind==2,]    
 })

工作?

答案 2 :(得分:0)

仅创建单独的数据集以将函数应用于所有这些数据集以后没有多大意义。最好将它们放在一个列表中 您的Y已经是数据框列表,因此我们可以构建一个函数,将数据框作为输入并将其拆分为testtrain集:

create_sets <- function(x){
    train_set <- sample(2, nrow(x), replace = TRUE, prob = c(0.7, 0.3)) 
    train <- x[train_set == 1, ]
    test <- x[train_set == 2, ]
    assign('x', list(train = train, test = test))
}

这正是如此,使用您已经使用的示例方法,但您可以使用任何方法。 除了assign()之外,它还将两个集合插入到原始对象中,因此我们将有一种简单的方法在单个对象中引用它。

Ylist <- lapply(Y, create_sets)

现在Ylist是一个列表列表。 Ylist的每个元素都是一年,其中有两个元素traintest。例如Ylist$'2016'$test 包含2016年的测试集。

希望这可以按预期工作。