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

标签 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 都可以变化

对于同时改变 x 和 y 的 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 中指定字段中值的出现次数,满足某些条件。条件是数字常量或文本字符串,每个字段一个。例如,我可能想要计算满足条件 >360 in field1、>0 in field2 等的出现次数。因此,允许 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 部分。

感谢您的任何评论。

最佳答案

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

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)。然后,f1mapply 上下文中使用 .f1 来改变 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

关于r - 函数 (x,y),x 和 y 都变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753698/

相关文章:

r - lapply 和 do.call 有什么区别?

在ggplot中删除图层图例

php - 如何将 Phalcon 的 .volt 中的变量转换为 int?

mysql - 在使用 COUNT() 和 GROUP BY 时如何包含 NULL 计数,因为 COUNT 会忽略 MySQL 中的 NULL?

sql - 使用 SQL 检查列中是否存在某种模式的最快方法

sql-server - 使用 RODBC 和 MS SQL Server 长时间运行的查询超时

r - 如何在列上使用 tidyeval 进行变异?

android - 如何将变量传递给库项目?

python - 变量和函数帮助//Python

multithreading - 减少导致高CPU使用率的特定进程的线程数