Есть ли способ создать для l oop с переменными char, чтобы создать несколько графиков? - PullRequest
1 голос
/ 23 февраля 2020

Я новичок в R и не могу найти решение своей проблемы. Я думаю, что проблема довольно проста. У меня есть df с 4 переменными: дата, SKU_code, SKU_category и sales_amount. Я хочу создать для l oop для построения n цифр, где n равно количеству SKU_category. Другими словами, это код, который я хочу преобразовать в a для l oop. Это работает, но у меня есть более 50 категорий, поэтому это не эффективно:

dfsales_red_cat <- dfsales %>% group_by(date, SKU_code, SKU_category) %>% summarize(y=sum(sales_amount))
dfsales_red_C01 <- dfsales_red_cat %>% filter(SKU_category =="C01")
dfsales_red_C01 <- dfsales_red_C01[,c(1,2,4)]
ggplot(dfsales_red_C01,aes(x=date,y=y,colour=SKU_code,group=SKU_code)) + theme(legend.position="none") + geom_line()+labs(title="C01", y='Sales',x='Year')

dfsales_red_C02 <- dfsales_red_cat %>% filter(SKU_category =="C02")
dfsales_red_C02 <- dfsales_red_C02[,c(1,2,4)]
ggplot(dfsales_red_C02,aes(x=date,y=y,colour=SKU_code,group=SKU_code)) + theme(legend.position="none") + geom_line()+labs(title="C02", y='Sales',x='Year')

...and so on...

Я пытался с этим, но это не сработало

dfsales_red_cat <- dfsales %>% group_by(date, SKU_code, SKU_category) %>% summarize(y=sum(sales_amount))

cat <- unique(dfsales_red_cat$SKU_category)

for (i in cat) {
    dfsales_red_i <- dfsales_red_cat %>% filter(SKU_category==i)
  dfsales_red_i <- dfsales_red_i[,c(1,2,4)]
  ggplot(dfsales_red_i,aes(x=date,y=y,colour=SKU_code,group=SKU_code)) + theme(legend.position="none") + geom_line()+
    labs(title=i, y='Sales',x='Year')
}

Спасибо за вашу помощь .

Это часть исходной таблицы dfsales_red_cat (> 10000 строк) и форматами даты, char, char, number:

    DATE SKU_code SKU_category sales_amount
1   2016-01-03  Z0003   C13 298380.0
2   2016-01-03  Z0005   C10 225433.6
3   2016-01-03  Z0006   C10 2246883.8
4   2016-01-03  Z0007   C10 653144.4
5   2016-01-03  Z0009   C15 170233.4

1 Ответ

0 голосов
/ 23 февраля 2020

Вам нужно либо print, сохранить его в списке и print, либо просто facet_wrap. Сначала получите что-то вроде ваших данных:

sample_dates=seq(as.Date("2016-01-03"),as.Date("2016-12-03"),length.out=50)

df = expand.grid(
date = sample_dates,
SKU_code = c("Z0003","Z0005","Z0006"),
SKU_category = c("C13","C10")
)

df$date = as.Date(df$date)
df$sales_amount = runif(nrow(df))
cat <- unique(df$SKU_category)

Просто print:

for (i in cat) {
  df_i <- subset(df,SKU_category==i)
  g = ggplot(df_i,aes(x=date,y=sales_amount,colour=SKU_code,group=SKU_code)) + 
  theme(legend.position="none") + geom_line()+
  labs(title=i, y='Sales',x='Year')
  print(g)
}

Сохранить в списке:

plts = lapply(cat,function(i){
g = ggplot(df_i,aes(x=date,y=sales_amount,colour=SKU_code,group=SKU_code)) + 
      theme(legend.position="none") + geom_line()+
      labs(title=i, y='Sales',x='Year')
return(g)
})
plts[[1]]

Или:

ggplot(df,aes(x=date,y=sales_amount,colour=SKU_code,group=SKU_code)) + 
theme(legend.position="none") + geom_line()+
labs(y='Sales',x='Year')+
facet_wrap(~SKU_category)
...