如何在R中用多个函数和多个变量按条件写一个for(){}循环?

时间:2014-10-07 03:26:03

标签: r

我有一个看起来像这样的数据集....还有更多的变量......

但我只对使用for(){}命令对其中四个运行一些统计信息感兴趣....... dataset = b1

ELEV   SLOPE    ASPECT     presab
2342.569   0.297   109.502   1 
2280.851   0.997   106.433   2
2281.271   0.665    93.872   1
2277.854   2.407   215.193   2
2271.858   1.132    32.050   1
2229.149   0.000   270.000   1

使用for(){}如何循环多个统计函数(mean,sd,length);

多个变量(高程,坡度,方位); 通过presab; 并将它们导出为工作环境中的三个R对象???

这是我得到的.....有人可以帮忙吗?

首先我尝试了这个.....它有点工作......

>i=1
>for (i in 1:1) {
    v1=tapply(b1$ASPECT,b1$presab,mean)
    v2=tapply(b1$ELEV,b1$presab,mean)
    v3=tapply(b1$SLOPE,b1$presab,mean)
    v4=cbind(v1,v2,v3)
    print(v4)}

#        v1       v2       v3
#1 137.3997 2400.974 4.075000
#2 131.2396 2400.301 3.306509

我也试过这种格式......

>vars=c("b1$ELEV","b1$SLOPE","b1$ASPECT")
>i=1
>for (i in 1:3) {
    tapply(b1$ASPECT,b1$presab,mean),
    tapply(b1$ELEV,b1$presab,mean),
    tapply(b1$SLOPE,b1$presab,mean)}

任何面包屑都会帮我找到回家的路.......

2 个答案:

答案 0 :(得分:1)

感谢大家的发帖!

我找到了一种使用for(){}函数来循环的方法来构建一个可以很好地退出的矩阵

>ex17out <- matrix(0,3,6)
for (i in 1:2) {
  temp <- subset(b3,presab==i)
  ex17out[1,i*3-2] <- mean(temp$ASPECT)
  ex17out[1,i*3-1] <- sd(temp$ASPECT)
  ex17out[1,i*3] <- length(temp$ASPECT)
  ex17out[1,i*3-2] <- mean(temp$ASPECT)
  ex17out[1,i*3-1] <- sd(temp$ASPECT)
  ex17out[1,i*3] <- length(temp$ASPECT)
  ex17out[2,i*3-2] <- mean(temp$ELEV)
  ex17out[2,i*3-1] <- sd(temp$ELEV)
  ex17out[2,i*3] <- length(temp$ELEV)
  ex17out[2,i*3-2] <- mean(temp$ELEV)
  ex17out[2,i*3-1] <- sd(temp$ELEV)
  ex17out[2,i*3] <- length(temp$ELEV)
  ex17out[3,i*3-2] <- mean(temp$SLOPE)
  ex17out[3,i*3-1] <- sd(temp$SLOPE)
  ex17out[3,i*3] <- length(temp$SLOPE)
  ex17out[3,i*3-2] <- mean(temp$SLOPE)
  ex17out[3,i*3-1] <- sd(temp$SLOPE)
  ex17out[3,i*3] <- length(temp$SLOPE)
  }
>ex17out


           [,1]      [,2] [,3]       [,4]       [,5] [,6]
[1,]  131.599609 86.628193   46  135.00713  75.039541  182
[2,] 2276.916891 44.433890   46 2431.90777 179.167677  182
[3,]    4.066087  4.654311   46    3.59589   4.826945  182

答案 1 :(得分:0)

使用自定义函数和plyr包的方式。

首先,您构建一个函数来计算您选择的摘要统计信息并作为命名向量返回:

statistics <- function(x, na.omit=TRUE){
  fun_names <- c("Length", "Mean", "SD")

  if(na.omit)
    x <- x[!is.na(x)]

  n <- length(x)
  m <- mean(x)
  s <- sd(x)

  stats <- c(n,m,s)
  names(stats) <- fun_names
  return(stats)
}

然后,在presab定义的每个peace data.frame中,将此函数应用于所需的所有变量。来自ddply套餐的plyr让这项任务变得轻而易举:

library(plyr)

summary <- ddply(b1, "presab", function(df) statistics(df[ , sapply(df, is.numeric)]))

对此处发生的事情的一个小解释:ddply会将data.frame b1除以presab值,并在每个值中应用(匿名)函数。此函数将计算b1中存在的所有数字变量的统计信息。 sapply(df, is.numeric)部分确保仅尝试使用数字变量来计算其摘要。

希望它有所帮助!