2017-02-17 8 views
0

Я пытаюсь сравнить и построить распределение переменной с параметром преобразования журнала переменной.Использование для выражения для сравнения графиков в кадре данных в R

Что я говорю ниже, для каждой переменной в mtcars, если она является числовым или целочисленным, возвращает гистограмму, а затем возвращает гистограмму с преобразованием журнала, чтобы я мог сравнивать.

Любая помощь будет оценена по достоинству.

for(i in ncol(mtcars)){ 
    par(mfcol = c(1,2)) 
    if (as.numeric | as.integer(mtcars[,i]) == T){ 
     return(hist(mtcars[,i]))} 
    if (as.numeric | as.integer(mtcars[,i]) == T){ 
     return(hist(log(mtcars[,i])+1))} 
} 

Error in as.numeric | as.integer(mtcars[, i]) == T : 
operations are possible only for numeric, logical or complex types 
+1

Вы являетесь не передавая никаких аргументов функции 'as.numeric' – OdeToMyFiddle

ответ

2

Это не имеет ничего общего с hist(), это if заявление, что не имеет особого смысла.

  • Вы хотите использовать is.numeric() и is.integer()
  • Оба требуют аргумент is.numeric(mtcars[,i]) и is.integer(mtcars[,i]).
  • is.numeric() и is.integer() уже возвращают boolean, поэтому нет необходимости проверять == T

Ваш код должен прочитать:

for(i in ncol(mtcars)){ 
    if (is.numeric(mtcars[,i]) | is.integer(mtcars[,i])){ 
    return(hist(mtcars[,i])) 
    return(hist(log(mtcars[,i])+1)} 
} 

Вы также должны знать, что это почти всегда лучше использовать в apply семейство функций вместо петель, например:

apply(mtcars, 2, function(x) {hist(log(x)+1); hist(x)}) 
+0

Спасибо GGamba. Я буду использовать эту функцию для решения подобных запросов. – Starbucks

+0

Единственное, чего не хватает при использовании оператора приложения, это имена гистограмм. Таким образом, его грубо сравнивать и контрастировать преобразованные переменные в сравнении с их оригинальными формами. – Starbucks

+1

Это правда, мы модифицируем и используем: 'sapply (names (mtcars), function (x) {hist (log (mtcars [, x]) + 1, xlab = x); hist (mtcars [, x], xlab = х)}) '. Обратите внимание на использование 'sapply' вместо' apply' – GGamba

1

Вы должны использовать функцию is.numeric и is.integer. Использование as. не имеет смысла в выражении if.

Это будет правильный подход:

for(i in ncol(mtcars)){ 
    par(mfcol = c(1,2)) 
    if (is.numeric(mtcars[,i] | is.integer(mtcars[,i])){ 
     return(hist(mtcars[,i])) 
    } 
    else { 
     return(hist(log(mtcars[,i])+1)) 
    } 
}