从R中的大型数据集创建多个子集

时间:2017-06-27 17:48:05

标签: r dataframe split

我正在尝试从单个大型数据集创建多个子集。

UID<-c(1:6)
ID<-rep(UID,times=36)
UConc<-runif(216)
df<-data.frame(ID,UConc)

UID2<-c(1:6)
ID2<-rep(UID,each= 96,times=36)
UConc2<-runif(216*96)
df2<-data.frame(ID2,UConc2)

我想从数据框(df和df2)创建36个子集,其中id为1-6,各自具有各自的浓度。每个ID重复但相应的浓度不同。 我尝试使用Split(x,f,...)给出每个ID的输出(例如:所有ID == 1和各自的浓度),但这不是我想要的。我希望ID 1-6具有各自的浓度和36个这样的子集。希望这个解释清楚。 任何帮助表示赞赏。 谢谢。

1 个答案:

答案 0 :(得分:1)

split(df, ave(seq_along(df$ID), df$ID, FUN = seq_along))

ave(seq_along(df$ID), df$ID, FUN = seq_along)将为每个ID出现的次数分配一个计数,当您拆分时,所有ID都将在每个组中。

将每个组保存为单独的CSV

mylist = split(df, ave(seq_along(df$ID), df$ID, FUN = seq_along))
dir.create("Test_CSVs")
sapply(1:length(mylist), function(i)
    write.csv(x = mylist[i],
              file = paste("Test_CSVs/test_", i, ".csv", sep = ""),
              row.names = FALSE))

如果每个子组中每个ID的数量超过1个,请尝试

#DATA
UID<-c(1:6)
ID<-rep(UID,each= 96,times=36)
UConc<-runif(216*96)
df<-data.frame(ID,UConc)

N = sum(1 == df$ID)/36
mylist = split(df, ceiling(ave(seq_along(df$ID), df$ID, FUN = seq_along)/N))

#Test
unique(unlist(lapply(mylist, NROW)))
#[1] 576 
#Each sub-group has 576 rows