2013-09-22 2 views
0

У меня есть список фреймов данных, называемых mylist. Заголовки списка являются имена людей и кадры данных содержат столбцы с данными, связанными с этими именами (дата, рост, вес и т.д.)Boxplot with for for

names(mylist[1]) 
[1] "John" 
names(mylist[2]) 
[1] "Susan" 


mylist[[1]] 
[1] name date hight weight .... 
    John 1950 1.81 78 
    John 1948 1.60 60 
    John 1935 1.50 55 

mylist[[2]] 
[1] name date hight weight .... 
    Susan 1985 1.40 40 . 
    Susan 1995 1.45 60 
    Susan 1990 1.25 40 

Я хочу создать boxplot для каждой из метрик: один boxplot для высоты, один для веса и т. д. И я хочу включить только в каждую метрическую коробку всю информацию о людях. Например, я хочу построить поле для высоты, которое содержит информацию Джона, Сьюзан и т. Д.

Вот моя попытка цикла, но она не работает.

for(s in 3:21) { 
boxplot(x=for(i in 1:99){ mylist[[i]][s]})) 
} 

Привет, ребята, я применил nograpes решение. Хотя код, который он предложил:

ggplot(melted.df,aes(x=name,y=value)) + 
geom_boxplot() + facet_grid(variable~.,scales='free') 

стеки каждый boxplot друг над другом и, наконец, сюжет не читается, как есть 16 присущи рефлективный, вербальный. Таким образом, хорошая идея - создать 16 разных ящиков, по одному для каждой метрики.

Я искал решения для этого и один, чтобы запустить этот код:

tomelt<-data.frame(c(daily[1],daily[2],daily[3])) #create a data.frame with variable name, date and the variable to be ploted. 

melted.df<-melt(tomelt,id.vars=c('name', 'date')) #convert to long form 
ggplot(melted.df,aes(x=name,y=value)) + geom_boxplot() #plot 

16 раз, каждый раз меняя код для вызова другой показатель (столбец) кадра данных ... но очевидно, что это неэффективно.

У вас есть идеи по созданию цикла for для этого?

+0

Было бы полезно, если бы вы дали нам выход 'dput (MyList)', чтобы мы могли просто вырезать и вставить свои данные в наших сессий. – nograpes

+0

Спасибо, сны! Проблема в том, что данные hughe! он имеет 16 показателей и более 50 000 наблюдений. – user2794659

+1

Ну, есть [хороший FAQ] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), который показывает вам некоторые методы по сокращению ваших данных для вопросов. Но, коротко, вы можете использовать 'dput (head (mylist))', и это даст нам только первые шесть в вашем списке. – nograpes

ответ

0

Есть много вещей, которые вам, кажется, отсутствуют здесь. Во-первых, похоже, что если у вас есть 16 показателей и 50 000 наблюдений, при 10 наблюдениях на человека вы получите 80 000 ящиков. Возможно, вас интересовали только первые несколько человек или что-то в этом роде.

У вас есть что узнать о for петлях. Вы обязательно должны выбрать руководство по R и попробовать сначала несколько основных вещей.

С цикл, я думаю, что вы хотели сделать что-то вроде этого:

for(s in 3:ncol(mylist[[1]])) { 
    for(i in 1:length(mylist)){ 
    boxplot(mylist[[i]][s]) 
    } 
} 

Но даже это не будет работать, каждый участок будет перезаписывать последний, так что вы должны положить его в сетка с par(mfrow=c(num.rows,num.cols)). Но есть намного лучшие варианты. Вы должны посмотреть на ?boxplot, особенно на примеры; есть много примеров, которые применимы к вашей ситуации. Также рассмотрим ggplot2. Например, попробуйте этот код, который аккуратно построит ваши данные в строках и столбцах без циклов.

# Stick your list together. 
one.df<-do.call(rbind,mylist) 
# Convert to "long-form". 
library(reshape) 
melted.df<-melt(one.df,id.vars=c('name','date')) 
# Plot with ggplot2 
ggplot(melted.df,aes(x=name,y=value)) + 
geom_boxplot() + facet_grid(variable~.,scales='free') 

enter image description here

+0

Привет, сенаторы! Спасибо за ответ! Я попробовал код для графика ggplot2, но он говорит: «Ошибка в layout_base (данные, строки, drop = drop): . По крайней мере, один слой должен содержать все переменные, используемые для фасетки« – user2794659

0

Я недавно сделал это. У меня есть кадр данных, и я хочу построить столбцы с 3 по 10 в качестве оси y в каждом из 8 ящиков с столбцом 1. df называется «Событие». Вы должны создать новый фрейм данных («boxdf») каждый раз с тем же COLNAMES, хромые, но это работает:

for (g in 3:ncol(Event)) 
    { 
     SaveBox = paste0("boxplot_",colnames(Event[g]),"_",g,".png") 
     boxdf <- data.frame(Event$event_type,Event[g]) 
     colnames(boxdf) = c("event_type","ycol") 
     boxplot(ycol~event_type,data=boxdf, main = colnames(Event[g]), xlab="type: 0:non-event, 1:event", ylab=colnames(Event[g]),col=c("blue","red")) #Event[g] 
     dev.copy(png,SaveBox) 
     dev.off() 
     rm(boxdf) 
    } 

О, это также экономит каждый boxplot в текущий каталог. В сохранить линии:

SaveBox = paste0("boxplot_",colnames(Event[g]),"_",g,".png") 
... 
dev.copy(png,SaveBox) 
      dev.off() 
+0

Сначала я попытался просто ссылаться на ось y как as.name (colnames (Event [g])) как в: boxplot (as.name (colnames (Event [g])) ~ event_type, data = Event ...) но это не сработало. – Gecko17k