2015-05-13 2 views
-3

У меня есть еще один вопрос R. Я пытаюсь сделать некоторые проверки типов, но не могу точно понять, что я делаю неправильно.R Тип Проверка

Я пытаюсь создать гистограмму для каждого уровня y. Так, например, я хочу создать накладывания гистограмм вида ириса данных и их чашелистник ширины и т.д.

Вот то, что я до сих пор:

#if x isn't numeric 
    if(!is.numeric(x)){ 
    #if y isn't a factor 
    }else if(!is.factor(y)){ 
    #if the length of x isn't equal to y 
    }else if(nChar(x) != nChar(y)){ 
    #error message 
    stop('x is not numeric/y is not a factor/both x and y are the same     length') 
} 
#otherwise create histogram 
#testing with iris data set 
hist(y, main = "Iris Species", xlab = "Sepal Width", col = "orange", border ="blue") 
+1

, что именно ваш вопрос? На данный момент я могу просто сказать, что я не знаю функции 'nChar' (это из пакета?), И я предполагаю, что вы скорее хотите использовать' length' – Cath

+1

Некоторые ключевые части, кажется, отсутствуют в вашем коде , Что значит «делать неправильно»? – Roland

ответ

4

Я обычно использую stopifnot() для этого, так что вы сначала проверьте самое простое условие, затем переходите к более сложному; Вы не хотите, чтобы проверить их все сразу, если первый из них является недействительным:

stopifnot(is.numeric(x)) 
stopifnot(is.factor(y)) 
stopifnot(length(x) == length(y)) 

С другой стороны, делать все это на одном дыхании:

if(!(is.numeric(x) && is.factor(y) && length(x)==length(y))){ 
    stop("your error message") 
} 

Теперь мне не понятно почему вы вообще не тестируете y, так как аргумент 'y' не равен hist(). Возможно, вы планировали строить отдельные гистограммы для x для каждого уровня y?

Если да, то вы должны быть в состоянии адаптировать следующее:

x <- iris$Sepal.Width 
y <- iris$Species 
l1 <- length(levels(y)) 
## temporarily change plotting parameters 
op <- par(mfrow = c(1, l1)) 
for (i in 1:l1){ 
    hist(x[y == levels(y)[i]], 
     main=paste0("Iris Species: ", levels(y)[i]), 
     xlab = "Sepal Width", 
     col="orange", 
     border="blue") 
} 
par(op) 

дает:

enter image description here

Я не осведомлен о nChar функции в R; length() обычно используется для этого.

Это перекрывающий подход. Обратите внимание, что петли for часто легче читать, чем apply, а потеря скорости, вероятно, будет относительно небольшой.

for (i in 1:l1){ 
    hist(x[y == levels(y)[i]], 
     ## main=paste0("Iris Species: ", levels(y)[i]), 
     main="Iris Species: ", 
     xlab = "Sepal Width", 
     col=i+1, 
     add=!(i==1)) 
} 
legend(x=4, y=25, legend=levels(y), fill=1+(1:l1)) 

дает:

enter image description here

+0

Да, это то, что я пытался сделать: график отдельных гистограмм для x для каждого уровня y – Ashley

+0

Я хочу наложить их на – Ashley

+0

Я бы хотел их пересечь. – Ashley

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