我正在尝试从单个大型数据集创建多个子集。
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个这样的子集。希望这个解释清楚。 任何帮助表示赞赏。 谢谢。
答案 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