【问题标题】:split 3 data frames evenly using the unique id使用唯一 id 平均分割 3 个数据帧
【发布时间】:2020-02-29 20:36:53
【问题描述】:

我有三个表:uploadpap1pap2)每个表有 50 列和 15 万行,我想将三个 s 拆分为匹配的多个数据帧(其中每个子集都有最多 1000 行)使用唯一的主键, 例如,subset_upload1subset_pap1subset_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)

我希望的结果是:

    subupload1<-data.frame(employee_id =1,employee = "John",salary=21000,startdate=as.Date('2010-11-1'))
   subpap1_1<-data.frame(employee_id=1,line_1='address1',line_2='address1',postcode='postcode1')
         subpap2_1<-data.frame(age=57,Height=150,gender='M',enddate=as.Date('202011-1'))

【问题讨论】:

  • 如果您有数据框 dput(head(mydataframe))) 的示例,将会有所帮助。当您说您有 3 个表时,您的意思是 data.frames,还是这些表必须首先转换为 dataframe 类型?我有点不清楚,但这可能只有我一个人。
  • 这似乎是一个适合split 函数的任务。如果您不能提供示例,请查看:rdocumentation.org/packages/base/versions/3.6.2/topics/split
  • 我添加了一个示例@DimitriosZacharatos,对不起,我是 R 新手
  • 我正在尝试了解问题以提供帮助并获得一些分数。不用后悔
  • 在我看来这是一个子集问题

标签: dataframe r dataframe data-manipulation


【解决方案1】:

我们可以使用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))

但是,请尝试使用列表来更好地处理/管理数据,而不是使用大量对象污染您的全局环境。


如果我们想将所有这些都写成 csv,我们可以使用 write.csv 而不是 assign,例如:

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"))

【讨论】:

  • 谢谢@Ronak,如果我运行您的代码,那么每个数据框(150000 名唯一员工)最终会有 150000 个子表,我希望每个子表最多有 1000 名员工
  • @ryan 将第一行从n &lt;- 1 更改为n &lt;- 1000
  • 非常感谢您的帮助@Ronak,最后一个问题是有没有办法将它们全部保存为CSV文件
  • @ryan 您可以将assign 替换为write.csv,请参阅更新后的答案。
【解决方案2】:
upload<-data.frame(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')))

pap1<-data.frame(employee_id=c(1,2,3),
                 line_1=c('address1','address2','address3'),
                 line_2=c('address1','address2','address3'),
                 postcode=c('postcode1','postcode2','postcode'))

pap2<-data.frame(employee_id=c(1,2,3),
                 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')))

subupload1<-data.frame(employee_id=1,employee = "John",salary=21000,startdate=as.Date('2010-11-1'))
subpap1<-data.frame(employee_id=1,line_1='address1',line_2='address1',postcode='postcode1')
subpap2<-data.frame(employee_id=1,age=57,Height=150,gender='M',enddate=as.Date('2020-11-1'))

upload[upload$employee_id%in%1,]
upload[upload$employee_id%in%1:2,]
upload[upload$employee_id%in%1:3,]



upload<-upload[order(upload$employee_id),]
pap1<-pap1[order(pap1$employee_id),]
pap2<-pap2[order(pap2$employee_id),]


upload<-data.frame(employee_id=1:150000,
                   employee=sample(c('John','Peter','Jolie'),150000,replace=TRUE),
                   salary=sample(c(21000,23400,26800),150000,replace=TRUE),
                   startdate=sample(as.Date(c('2010-11-1','2008-3-25','2007-3-14')),150000,replace=TRUE))

split_setting<-c()
for(i in 1:(150000/1000))
  split_setting<-c(split_setting,rep(i,1000))

result<-split(upload,split_setting)

result$`1`
nrow(result$`1`)

【讨论】:

  • 非常感谢您这样做,但正如我在原始问题中提到的那样,我有三个表,每个表有 150,000 行是唯一的和员工,我需要将每个表拆分为多个表在我的示例中,至少有最多 1000 名员工遵循相同的逻辑,因此 subuplaod 将有 1000 名员工在 subpap1-1 和 subpap2-1 中相同,而 subupload2 将有第二次 1000 名员工在 subpap1-1 和 subpap2 上-1 以此类推
  • 别担心,您真的需要一种自动进行大量拆分的方法吗?
  • 我错过了什么
  • 没错,因为必须每天运行它
  • 每张表会被拆分成150张表,每张1000行,上传的子表在其他两个子表中必须有相同的employeeids
猜你喜欢
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
相关资源
最近更新 更多