使用for语句比较R中数据帧中的绘图

使用for语句比较R中数据帧中的绘图,r,for-loop,plot,R,For Loop,Plot,我试图比较并绘制一个变量的分布与该变量的对数变换的分布 下面我要说的是,对于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

我试图比较并绘制一个变量的分布与该变量的对数变换的分布

下面我要说的是,对于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

您应该使用函数
is.numeric
is.integer
。在if语句中使用
as.
毫无意义

这将是正确的方法:

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))
    }
}

您应该使用函数
is.numeric
is.integer
。在if语句中使用
as.
毫无意义

这将是正确的方法:

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))
    }
}

这与
hist()
无关,只有
if
语句没有多大意义

  • 您想使用
    is.numeric()
    is.integer()
  • 两者都需要参数
    为.numeric(mtcars[,i])
    是.integer(mtcars[,i])
  • is.numeric()
    is.integer()
    已返回一个
    布尔值
    ,因此无需检查
    ==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)})

这与
hist()
无关,只有
if
语句没有多大意义

  • 您想使用
    is.numeric()
    is.integer()
  • 两者都需要参数
    为.numeric(mtcars[,i])
    是.integer(mtcars[,i])
  • is.numeric()
    is.integer()
    已返回一个
    布尔值
    ,因此无需检查
    ==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)})

您没有将任何参数传递给
as.numeric
函数您没有将任何参数传递给
as.numeric
函数谢谢GGamba。我将使用此函数处理类似的请求。使用application语句时唯一缺少的是直方图的名称。因此,将转换后的变量与其原始形式进行比较和对比有点粗糙。没错,我们修改并使用:
sappy(名称(mtcars),函数(x){hist(log(mtcars[,x])+1,xlab=x);hist(mtcars[,x],xlab=x)
。注意使用
sapply
而不是
apply
谢谢GGamba。我将使用此函数处理类似的请求。使用application语句时唯一缺少的是直方图的名称。因此,将转换后的变量与其原始形式进行比较和对比有点粗糙。没错,我们修改并使用:
sappy(名称(mtcars),函数(x){hist(log(mtcars[,x])+1,xlab=x);hist(mtcars[,x],xlab=x)
。注意使用
sapply
代替
apply