Ссылка на имя переменной из списка при использовании prop.table в цикле - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь быстро сгенерировать несколько ggplot2 графиков из таблиц сопряженности, используя цикл for в R. Каждая переменная (R1...R7) сегментируется одной переменной (segment_r).

Я написал следующий цикл, но продолжаю получать ошибки.

question_names<-paste("R",1:7,sep='') # Create list with question names

attach(df)
for (i in length(question_names)) {
  question_names[i]<-factor(question_names[i])
  means<-prop.table(table(get(question_names[i]),segment_r),2)*100
  means.long<-melt(means,id.vars="segment_r")
  p<-ggplot(means.long,aes(x=Var1,y=value,fill=factor(Var2)))+
    geom_bar(stat="identity",position="dodge")+coord_flip()+
    scale_fill_discrete(name="Segment",
                        breaks=c(1:4),
                        labels=c(1:4))+
    xlab("")+ylab("Mean Percentage")
  p <- p + facet_wrap( ~ Var2, ncol=4)
  p
  }
detach(df)

Я пытался включить get в table, что приводит к ошибке: Error in get(question_names[i]) : object '1' not found).Однако пропуск get также не работает: Error in table(question_names[i], segment_r) : all arguments must have the same length.

Мысли?Я также открыт для решения, которое генерирует несколько графиков без использования loop - здесь скорость.

Для запроса, примеры данных ниже:

df <- read.csv(text="R1, R2, R3, R4, R5, R6, R7, segment_r
Apples, Fruit salad, Pasta, Mexican, Apples, Cheese, Salad, Segment 1
Apples, Fruit salad, Pasta, Mexican, Apples, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Mexican, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Mexican, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, Cheese, Salad, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, Cheese, Salad, Segment 2
Oranges, Ice cream, Pasta, Thai, Oranges, Milk, Salad, Segment 2
Bananas, Ice cream, Pasta, Thai, Bananas, Milk, Salad, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, Milk, Salad, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, Milk, Salad, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, Milk, Side, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, Milk, Side, Segment 2
Bananas, Pie, Pizza, Chinese, Bananas, Milk, Side, Segment 3
Bananas, Pie, Pizza, Chinese, Bananas, Milk, Side, Segment 3
Apples, Fruit salad, Pasta, Mexican, Apples, Milk, Side, Segment 4
Apples, Fruit salad, Pasta, Mexican, Apples, Milk, Side, Segment 4
Oranges, Fruit salad, Pasta, Mexican, Oranges, Milk, Side, Segment 4
Oranges, Fruit salad, Pasta, Mexican, Oranges, None, Side, Segment 4
Oranges, Fruit salad, Pasta, Thai, Oranges, None, Side, Segment 1
Oranges, Fruit salad, Pasta, Thai, Oranges, None, Side, Segment 1
Oranges, Fruit salad ,Pasta, Thai, Oranges, None, Side, Segment 2
Oranges, Ice cream, Pasta, Thai, Oranges, None, Side, Segment 2
Bananas, Ice cream, Pasta, Thai, Bananas, None, Side, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Ice cream, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Pie, Pasta, Chinese, Bananas, None, Fries, Segment 2
Bananas, Pie, Pizza, Chinese, Bananas, None, Fries, Segment 3
Bananas, Pie, Pizza, Chinese, Bananas, None, Fries, Segment 3")

1 Ответ

0 голосов
/ 04 июня 2018

Мне неясно, что именно вы хотите «сделать» с этими сюжетами.Но перевод вашего кода во что-то, что «работает», может выглядеть так:

library(reshape2)
library(ggplot2)

question_names <- paste("R", 1:7, sep='') # Create list with question names

for (q in question_names) {
  means <- prop.table(table(df[[q]], df[["segment_r"]]),2)*100
  means.long <- melt(means, id.vars="segment_r")
  p <- ggplot(means.long, aes(x=Var1, y=value, fill=factor(Var2)))+
    geom_bar(stat="identity",position="dodge") + coord_flip()+
    scale_fill_discrete(name="Segment",
                        breaks=c(1:4),
                        labels=c(1:4))+
    xlab("")+ylab("Mean Percentage")
  p <- p + facet_wrap( ~ Var2, ncol=4)
  print(p)
}

Это приведет к тому, что все графики будут помещены в графическое окно (хотя последний график перезаписывает предыдущий график).Но это избавляет от attach() и get() как минимум.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...