2013-05-24 3 views
0

Я хочу сделать qqnorm-график из каждой переменной в моем кадре данных, используя sapply(). Это то, что я получил до сих пор:Заголовки в R, используя sapply()

myfun=function(x) { 
    c(qqnorm(x), 
    qqline(x) 
) 
} 

sapply(mydata, myfun) 

Это работает, однако, я хотел бы, чтобы каждый участок, чтобы иметь соответствующее имя переменной в названии сюжета. Как это делается?

Thanx много ;-)

+0

Прочитано 'qqnorm'. Обратите особое внимание на аргумент 'main'. – Roland

+0

Спасибо Roland, я знаю главный аргумент, однако я не знаю, как установить его так, чтобы он отображал имя каждой соответствующей переменной (в полученной графике, созданной sapply). – jakub

+0

Почему вы не используете для этого старый добрый цикл 'for'? Поскольку вы не хотите получить возвращаемое значение, циклы '* apply' не предлагают никаких преимуществ здесь. – Roland

ответ

1

В этом случае l_ply более подходит, потому что вам просто нужно построить график, и поэтому выход не требуется. На основании @Henrik ответа мы имеем

require(plyr) 
myfun <- function(x, data, ...) { 
    c(qqnorm(data[[x]], main = names(data)[x], ...), 
    qqline(data[[x]]) 
) 
} 

l_ply(seq_len(ncol(swiss)), myfun, data = swiss) 

EDIT

Если вы хотите увидеть свои графики, у вас есть много вариантов, и один из них, чтобы разделить вас черчением устройства и сюжетом каждый qqplot в одной части устройства.

par(mfrow = c(3, 2)) 
l_ply(seq_len(ncol(swiss)), myfun, data = swiss) 
+0

Мне нравится введение эллипсиса ('...'), выглядит автоматически более профессиональным (также используя 'seq_len'). [Могу только сказать одно.] (Http://i.qkme.me/3qcu1t.jpg) – Henrik

+0

Звучит разумно, но ничего не имеет. – jakub

+0

Это работает для меня ... хммм, но если у вас проблемы, используйте sapply или lapply then. – dickoa

0

Проблема в том, что когда вы делаете это, как что names не передаются в функцию, но только безымянный элемент списка. Вам нужно немного изменить функцию и просто рукой по индексу, а затем работать на весь объект (т.е., неявно делает для цикла и с использованием итератора):

data(swiss) 

myfun=function(x, data) { 
    c(qqnorm(data[[x]], main = colnames(data)[x]), 
    qqline(data[[x]]) 
) 
} 

lapply(1:ncol(swiss), myfun, data = swiss) 

Кроме того, я изменил функцию lapply и используйте в качестве примера набор данных swiss.

+0

Выглядит отлично, однако он говорит мне, что я использую (1: nrow (swiss), myfun, data = swiss) Ошибка в .subset2 (x, i, exact = exact): индекс за пределами, когда я пытаюсь его использовать. – jakub

+0

извините, должно быть 'ncol'. – Henrik

+1

Спасибо за ответ, просто небольшая опечатка Я думаю, что вы хотите 'qqline (данные [[x]])' – dickoa

0

Вот for цикл, который является имхо наиболее подходящей конструкции петли для этого.

for (i in seq_along(swiss)) { 
    qqnorm(swiss[,i], main = names(swiss)[i]) 
    qqline(swiss[,i]) 
    Sys.sleep(3) #to see something and avoid problems in RStudio 
} 
+0

О да, работает отлично. Как 3s задержка помогает избежать проблем? Просто любопытно. – jakub

+0

Ну, некоторые графики не показывались в RStudio, если я пропустил задержку. – Roland

Смежные вопросы