Dataframe 使用唯一id均匀分割3个数据帧

Dataframe 使用唯一id均匀分割3个数据帧,dataframe,r,data-manipulation,Dataframe,R,Data Manipulation,我有三个表:upload,pap1,pap2)每个表有50列和15万行,我想使用唯一的主键将这三个表拆分为匹配的多个数据帧(其中每个子集最多有1000行), 例如,subset\u upload1必须在subset\u pap1和subset\u pap2中具有相同的ID,依此类推 employee_id<-c(1,2,3) employee <- c('John','Peter ','Jolie') salary <- c(21000, 23400, 26800) s

我有三个表:
upload
pap1
pap2
)每个表有50列和15万行,我想使用唯一的主键将这三个表拆分为匹配的多个数据帧(其中每个子集最多有1000行), 例如,
subset\u upload1
必须在
subset\u pap1
subset\u pap2
中具有相同的ID,依此类推

 employee_id<-c(1,2,3)
 employee <- c('John','Peter ','Jolie')
 salary <- c(21000, 23400, 26800)
 startdate <- as.Date(c('2010-11-1','2008-3-25','2007-3-14'))

 upload<- data.frame(employee_id,employee, salary, startdate)

 employee_id<-c(1,2,3)
 line_1<-c('address1','address2','address3')
 line_2<-c('address1','address2','address3')
 postcode<-c('postcode1','postcode2','postcode')

 pap1<-data.frame(employee_id,line_1,line_2,postcode)


 age<-c(57,43,23)
 Height<-c(150,170,190)
 gender<-c('M','M','F')
 enddate<-as.Date(c('2020-11-1','2020-3-25','2020-3-14'))

 pap2<-data.frame(employee_id,age,Height,gender,enddate)

employee\u id
upload
upload我们可以使用
while
循环来随机抽样
n
唯一id,并分别从3个数据帧中将其子集,以创建新的数据帧

n <- 1 #Number of unique primary key in one dataframe
remaining_ids <- unique(upload$employee_id)
counter <- 1

while(length(remaining_ids) > n) {
   ids <- sample(remaining_ids, n)
   assign(paste0("subupload_", counter), subset(upload, employee_id %in% ids))
   assign(paste0("subpap1_", counter), subset(pap1, employee_id %in% ids))
   assign(paste0("subpap2_", counter), subset(pap2, employee_id %in% ids))
   counter <- counter + 1
   remaining_ids <- setdiff(remaining_ids, ids)
}

assign(paste0("subupload_", counter),subset(upload, employee_id %in% remaining_ids))
assign(paste0("subpap1_", counter), subset(pap1, employee_id %in% remaining_ids))
assign(paste0("subpap2_", counter), subset(pap2, employee_id %in% remaining_ids))

我们可以使用
while
循环对
n
唯一id进行随机采样,并分别从3个数据帧中将其子集,以创建新的数据帧

n <- 1 #Number of unique primary key in one dataframe
remaining_ids <- unique(upload$employee_id)
counter <- 1

while(length(remaining_ids) > n) {
   ids <- sample(remaining_ids, n)
   assign(paste0("subupload_", counter), subset(upload, employee_id %in% ids))
   assign(paste0("subpap1_", counter), subset(pap1, employee_id %in% ids))
   assign(paste0("subpap2_", counter), subset(pap2, employee_id %in% ids))
   counter <- counter + 1
   remaining_ids <- setdiff(remaining_ids, ids)
}

assign(paste0("subupload_", counter),subset(upload, employee_id %in% remaining_ids))
assign(paste0("subpap1_", counter), subset(pap1, employee_id %in% remaining_ids))
assign(paste0("subpap2_", counter), subset(pap2, employee_id %in% remaining_ids))


如果您有一个数据帧dput(head(mydataframe))的示例,这会有所帮助。当您说您有3个表时,您是指data.frames,还是这些表必须首先转换为dataframe类型?这对我来说有点不清楚,但这可能只有我一个人。这似乎是一项适合于
拆分功能的任务。如果你不能提供一个例子,请看:我添加了一个例子@Dimitriszacharatos,对不起,我是国际扶轮的新手,我试图理解这个问题,以便帮助你并获得一些分数。不必抱歉,在我看来,这是一个子集问题。如果您有一个数据帧dput(head(mydataframe))的示例,它会有所帮助。当您说您有3个表时,您是指data.frames,还是这些表必须首先转换为dataframe类型?这对我来说有点不清楚,但这可能只有我一个人。这似乎是一项适合于
拆分功能的任务。如果你不能提供一个例子,请看:我添加了一个例子@Dimitriszacharatos,对不起,我是国际扶轮的新手,我试图理解这个问题,以便帮助你并获得一些分数。不必抱歉,在我看来这是一个分组问题,非常感谢您这么做,但正如我在原始问题中提到的,我有三个表,每个表有150000行,是唯一的和员工的,我需要将每个表拆分为多个表,每个表后面至少有1000行在我的例子中,逻辑是,subuplaod将有1000名员工,subpap1-1和subpap2-1中的员工是相同的,Subuplaud2将第二次有1000名员工,他们在subpap1-1和subpap2-1中是相同的,依此类推。不用担心,你真的需要一种方法以自动方式进行大量拆分吗?我确实遗漏了一些东西,因为必须每天运行它,每个表将被分成150个表,每个表中有1000行,上传的子表必须在其他两个子表中有相同的EmployeeID非常感谢您这么做,但正如我在原始问题中提到的,我有三个表,每个表有150000行,是唯一的,并且是雇员,我需要将每个表拆分为多个表,每个表至少有1000个雇员在我的例子中,一个遵循相同的逻辑,那么subuplaod将有1000名员工,subpap1-1和subpap2-1中的员工是相同的,subupload2将第二次有1000名员工,他们在subpap1-1和subpap2-1中,等等。不用担心,你真的需要一种方法以自动方式进行大量拆分吗?我确实遗漏了一些东西,因为必须每天运行它,每个表将被分成150个表,每个表中有1000行,上传的子表必须在其他两个子表中有相同的EmployeeID谢谢@Ronak如果我运行代码,那么每个数据帧将有150000个子表(150000个独特的员工),我希望每个子表最多有1000个employees@ryan将第一行从
n改为它工作得很好非常感谢您的帮助@Ronak,最后一个问题有没有办法保存它们files@ryan您可以将
assign
替换为
write.csv
,请参阅更新的答案。谢谢@Ronak如果我运行您的代码,那么我将为每个数据帧提供150000个子表(150000个唯一员工),我希望每个子表最多有1000个employees@ryan将第一行从
n改为它工作正常非常感谢您的帮助@Ronak,最后一个问题是有没有办法把它们都保存下来files@ryan您可以将
assign
替换为
write.csv
,请参阅更新的答案。
n <- 1 #Number of unique primary key in one dataframe
remaining_ids <- unique(upload$employee_id)
counter <- 1

while(length(remaining_ids) > n) {
   ids <- sample(remaining_ids, n)
   assign(paste0("subupload_", counter), subset(upload, employee_id %in% ids))
   assign(paste0("subpap1_", counter), subset(pap1, employee_id %in% ids))
   assign(paste0("subpap2_", counter), subset(pap2, employee_id %in% ids))
   counter <- counter + 1
   remaining_ids <- setdiff(remaining_ids, ids)
}

assign(paste0("subupload_", counter),subset(upload, employee_id %in% remaining_ids))
assign(paste0("subpap1_", counter), subset(pap1, employee_id %in% remaining_ids))
assign(paste0("subpap2_", counter), subset(pap2, employee_id %in% remaining_ids))
while(length(remaining_ids) > n) {
  ids <- sample(remaining_ids, n)
  write.csv(subset(upload, employee_id %in% ids), paste0("subupload_", counter, ".csv"))
  write.csv(subset(pap1, employee_id %in% ids), paste0("subpap1_", counter, ".csv"))
  write.csv(subset(pap2, employee_id %in% ids), paste0("subpap2_", counter, ".csv"))
  counter <- counter + 1
  remaining_ids <- setdiff(remaining_ids, ids)
}
write.csv(subset(upload, employee_id %in% remaining_ids), paste0("subupload_", counter, ".csv"))
write.csv(subset(pap1, employee_id %in% remaining_ids), paste0("subpap1_", counter, ".csv"))
write.csv(subset(pap2, employee_id %in% remaining_ids), paste0("subpap2_", counter, ".csv"))