函数(x,y),x和y都变化

时间:2013-12-24 01:36:59

标签: r variables count apply

我有一个由大约22个字段,一些系统ID和一些测量组成的数据框,例如

 bsystemid    dcesystemid  lengthdecimal  heightquantity  
 2218          58          22              263
 2219          58          22              197
 2220          58          22              241

我想要的是什么:

1。循环遍历字段ID列表

2。定义一个测试条件的函数

3。这样x和y都可以变化

y变量定义属于哪里,用于改变x和y?其他不同的结构?

此代码块适用于单个字段和y的值:

 varlist4<-names(brg) [c(6)]
 f1<-(function(x,y) count(brg[,x]<y) )
 lapply(varlist4, f1, y=c(7.5)) 

此代码块执行,但计数已关闭:

 varlist4<-names(brg) [c(6,8,10,12)]
 f1<-(function(x,y) count(brg[,x]<y) )
 lapply(varlist4, f1, y=c(7.5,130,150,0)) 

例如,

 varlist4<-names(brg) [c(6)]
 f1<-(function(x,y) count(brg[,x]<y) )
 lapply(varlist4, f1, y=c(7.5)) 

返回(正确),

       x freq
 1 FALSE 9490
 2  TRUE  309
 3    NA   41

而上面的多个x,y代码块为第一种情况返回

      x freq
 1 FALSE 4828
 2  TRUE 4971
 3    NA   41

感谢您提出任何意见。

更新

我想要的是自动计算df中指定字段中值的出现,满足某些条件。条件是数字常量或文本字符串,每个字段一个。例如,我可能想要计算在field1中满足条件&gt; 360,在field2中等于0的条件等等。通过允许x和y变化我的意思是使用字段名称和相应条件读取x和y向量进入一个循环结构。

我想自动执行此任务,因为它涉及大约30个表,每个表最多包含50个字段。我需要做两次,对于超过最大值的值扫描一次,对于小于最小值的值扫描一次。更好的方法是将条件加载到表中并在循环中引用它。这可能是下一步,但我想先了解这篇文章。

这个工作实例

 t1<-18:29
 t2<-c(76.1,77,78.1,78.2,78.8,79.7,79.9,81.1,81.2,81.8,82.8,83.5)
 t3<-c(1.2,-0.2,-0.3,1.2, 2.2,0.4,0.6,0.4,-0.8,-0.1,5.0,3.1)
 t<-data.frame(v1=t1,v2=t2,v3=t3)
 varlist<-names(t) [c(1)]
 f1<-(function(x,y) count(t[,x]>y) )
 lapply(varlist, f1, y=c(27))

说明第一个字段的正确答案,返回

       x freq
 1 FALSE   10
 2  TRUE    2

但是,如果我添加其他字段和相应的条件(y的),我会在第一种情况下得到不同的东西:

 varlist<-names(t) [c(1,2,3)]
 f1<-(function(x,y) count(t[,x]>y) )
 lapply(varlist, f1, y=c(27,83,3))


       x freq
 1 FALSE    8
 2  TRUE    4

 [[2]]
       x freq
 1 FALSE    1
 2  TRUE   11

 [[3]]
      x freq
 1 FALSE   11
 2  TRUE    1

我的感觉是我不会正确地构建y部分。

感谢您的任何评论。

1 个答案:

答案 0 :(得分:3)

您可以使用mapply。让我们创建一些数据:

set.seed(123) # to get exactly the same results
brg = data.frame(x = rnorm(100), y=rnorm(100), z=rnorm(100))
brg$x[c(10, 15)] = NA  # some NAs
brg$y[c(12, 21)] = NA  # more NAs

然后你需要定义完成工作的功能。函数.f1对数据进行计数,并确保始终有三个级别(TRUE,FALSE,NA)。然后,f1.f1上下文中使用mapply,以便能够改变xy。最后,对输出进行了一些改进(更改列的名称)。

f1 = function(x, y, data) {

  .f1 = function(x, y, data) {
    out = factor(data[, x] < y, 
                 levels=c("TRUE", "FALSE", NA), exclude=NULL)
    return(table(out))
  }

  out = mapply(.f1, x, y, MoreArgs = list(data = data)) # check ?mapply
  colnames(out) = paste0(x, "<", y) # more clear names for the output
  return(out)
}

最后,测试:

varlist   = names(brg)
threshold = c(0, 1, 1000)

f1(x=varlist, y=threshold, data=brg)

你应该得到

      x<0 y<1 z<1000
TRUE   46  87    100
FALSE  52  11      0
<NA>    2   2      0