我有一个由大约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部分。
感谢您的任何评论。
答案 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
,以便能够改变x
和y
。最后,对输出进行了一些改进(更改列的名称)。
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