Как объединить и создать подмножества в цикле for (R)? - PullRequest
0 голосов
/ 24 мая 2018

Я хочу оптимизировать этот код в цикле for для большего набора данных.

library(reshape2)
Customer<- c("Susan","Louis", "Frank","Susan")
Seller<- c("Ivan", "Donald","Chris","Ivan")
Service<-c("COU","CAR", "FCL","CAR")
Billingmean<- c(100,200,300,400)
WrsHoldSum<-c(0,0,0,0)
Group<- c("n1","n2"," "," ")
B1<- c(0,2,2,1) 
B2<-c(9,8,7,6)
B3<- c(5,4,3,2)
df<- data.frame(Customer, Seller,Service, Billingmean,WrsHoldSum, Group,B1,B2,B3)
sub1<- dcast(data= df, formula= Customer+Group+Seller+WrsHoldSum~Service,fun.aggregate= sum,value.var= "Billingmean")
sub2<- dcast(data= df, formula= Customer+Group+Seller+WrsHoldSum~Service,fun.aggregate= sum,value.var= "B1") 
sub3<- dcast(data= df, formula= Customer+Group+Seller+WrsHoldSum~Service,fun.aggregate= sum,value.var= "B2")
sub4<- dcast(data= df, formula= Customer+Group+Seller+WrsHoldSum~Service,fun.aggregate= sum,value.var= "B3")

finaldf<- merge (sub1,sub2, sub3, sub4,by=c("Customer","Group","Seller","WrsHoldSum"))

1 Ответ

0 голосов
/ 24 мая 2018

EDIT

Так как вы также хотите знать происхождение столбцов, которые не были частью аргумента by в merge, вы можете назвать эти столбцы перед Reduce(), используя lapply, которыйбудет удобно выводить список и сокращать ваш оператор Reduce():

Определить имена таблиц для lapply():

tNames <- grep(x = ls(), pattern = "^sub", value = T)

Затем использовать lapply() с пользовательской функцией, которая будетвыведите таблицы с уже измененными именами соответствующих столбцов.Используйте трубку %>% для удобства Reduce() список с merge():

lapply(seq_along(tNames), function(x){
  tSym <- as.name(tNames[[x]])

  d1 <- copy(eval(tSym))

  cols <- grep(x = names(d1), pattern = "^CAR|^COU|^FCL", value = T)

  setnames(d1, old = cols, new = paste0(cols, " B", x))

  return(d1)

}) %>% Reduce(function(x, y) merge(x, y, by = c("Customer","Group","Seller","WrsHoldSum")), .) 

Результат:

  Customer Group Seller WrsHoldSum CAR B1 COU B1 FCL B1 CAR B2 COU B2 FCL B2 CAR B3 COU B3 FCL B3 CAR B4 COU B4 FCL B4
1    Frank        Chris          0      0      0    300      0      0      2      0      0      7      0      0      3
2    Louis    n2 Donald          0    200      0      0      2      0      0      8      0      0      4      0      0
3    Susan         Ivan          0    400      0      0      1      0      0      6      0      0      2      0      0
4    Susan    n1   Ivan          0      0    100      0      0      0      0      0      9      0      0      5      0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...