разделить 3 кадра данных равномерно, используя уникальный идентификатор - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть три таблицы: upload, pap1, pap2) каждая таблица имеет 50 столбцов и 150 тысяч строк, я хочу разбить три на соответствующие несколько фреймов данных ( где каждое подмножество имеет до 1000 строк), используя уникальный первичный ключ, например, subset_upload1 должен иметь одинаковые идентификаторы в subset_pap1 и subset_pap2 и т. д. *

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

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Мы можем использовать while l oop для случайной выборки n уникальных идентификаторов и поднабора их из 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"))
0 голосов
/ 01 марта 2020
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`)
...