gpt4 book ai didi

r - 使用 for 循环对数据集进行分区

转载 作者:行者123 更新时间:2023-11-30 08:59:05 25 4
gpt4 key购买 nike

我正在尝试在 R 中创建一个函数,它返回一个数据帧列表,这些数据帧按每个因子级别进行子集化。

一个帮助解释我想要做什么的例子;

#Creating a dataset for my example
f1<-c("a","a","b","b","c","c")
f2<-c("x","y","x","y","x","y")
v1<-c(1:6)
v2<-c(7:12)
factors<-as.data.frame(cbind(f1,f2))
integers<-as.data.frame(cbind(v1,v2))
df<-cbind(factors,integers)



#The function
partition<-function(data){

factors<-Filter(is.factor,data) #Splitting data into factors
subsets<-list(NULL) #Creating an empty list where I
will put the subsets nm=0
for( i in 1:ncol(factors)){
nm=nm+nlevels(factors[,i])
}
nm

for( i in 1:ncol(factors)){

for(j in 1:nlevels(factors[,i])){
for(k in 1:nm){
subsets[[k]]<-df[which(factors[,i]==levels(factors[,i])[j]), ]
}
}
}

return(subsets)
}

partition(df)

这会产生:

[[1]]
f1 f2 v1 v2
2 a y 2 8
4 b y 4 10
6 c y 6 12

[[2]]
f1 f2 v1 v2
2 a y 2 8
4 b y 4 10
6 c y 6 12

[[3]]
f1 f2 v1 v2
2 a y 2 8
4 b y 4 10
6 c y 6 12

[[4]]
f1 f2 v1 v2
2 a y 2 8
4 b y 4 10
6 c y 6 12

[[5]]
f1 f2 v1 v2
2 a y 2 8
4 b y 4 10
6 c y 6 12

如您所见,这些都是相同的数据集。通过删除 k 上的循环,所有数据集都不同并正确进行子集化,但它只给了我三个数据集(因为最后一个因子变量中有两个级别,我们保留子集,其中 f1 == "c").

删除 k 上的 for 循环,我们得到;

[[1]]
f1 f2 v1 v2
1 a x 1 7
3 b x 3 9
5 c x 5 11

[[2]]
f1 f2 v1 v2
2 a y 2 8
4 b y 4 10
6 c y 6 12

[[3]]
f1 f2 v1 v2
5 c x 5 11
6 c y 6 12

我们缺少 f1 == "a"f1 == "b"

的子集

注意,我应该获得 5 个数据帧,因为我们有 2 + 3 个因子级别(在子集化之前的第一个 for 循环中计算为 nm

所以我的问题是,如何在不覆盖已经子集化的内容的情况下运行上述内容?

对于某些背景,这正在努力建立一个分类模型,它将产生 nfactor(df) 预测,然后我将运行 GLM 来对每个预测进行加权。

感谢您对我的问题的任何见解。

更新格伦的第一个答案简化了我的代码,这可能会使我遇到的问题更加明显。这是更新后的代码(请注意,使用 split() 函数,它在大型数据集上运行得更有效,所以谢谢 Glen。

for(k in 1:nm){
for( i in 1:ncol(factors)){
for( j in 1:nlevels(factors[,i])){
subsets[[k]]<-split(df,factors[,i])[j]
}
}
}

返回与我原来的问题相同的结果。问题是,当我在 k 到 nm 上运行循环时,循环会覆盖已经生成的内容。我该如何阻止这种情况发生?

最佳答案

如果我正确理解你的问题。您可以使用 split 函数轻松地完成此操作。

f1<-c("a","a","b","b","c","c")
f2<-c("x","y","x","y","x","y")
v1<-c(1:6)
v2<-c(7:12)
factors<-as.data.frame(cbind(f1,f2))
integers<-as.data.frame(cbind(v1,v2))
df<-cbind(factors,integers)


tmp1=split(df,f1)
tmp2=split(df,f2)
c(tmp1,tmp2)

关于r - 使用 for 循环对数据集进行分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47582193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com