R 函数(x,y),x和y都会变化
我有一个数据框,由大约22个字段、一些系统ID和一些度量值组成,例如R 函数(x,y),x和y都会变化,r,variables,count,apply,R,Variables,Count,Apply,我有一个数据框,由大约22个字段、一些系统ID和一些度量值组成,例如 bsystemid dcesystemid lengthdecimal heightquantity 2218 58 22 263 2219 58 22 197 2220 58 22 241 我想要的是: 一,。循环浏览
bsystemid dcesystemid lengthdecimal heightquantity
2218 58 22 263
2219 58 22 197
2220 58 22 241
我想要的是:
一,。循环浏览字段ID列表
二,。定义要测试条件的函数
三,。这样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))
而上面的多个x,y代码块在第一种情况下会返回此值
x freq
1 FALSE 4828
2 TRUE 4971
3 NA 41
谢谢你的评论
更新:
我想要的是在满足某些条件的情况下,自动计算df中指定字段中值的出现次数。条件是数值常量或文本字符串,每个字段一个。例如,我可能想计算满足条件的发生次数,字段1中大于360,字段2中大于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))
但如果我加入其他字段和相应的条件(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
varlist您可以使用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
统计数据,并确保始终有三个级别(真、假、NA)。然后,f1
在mapply
上下文中使用.f1
,以便能够改变x
和y
。最后,对输出进行了一些改进(更改列的名称)
你应该得到
x<0 y<1 z<1000
TRUE 46 87 100
FALSE 52 11 0
<NA> 2 2 0
<代码>席不能效法你。请生成一个工作示例。听起来您需要mapply
?好的,我来回顾一下mapply。什么是函数“count”?您的工作示例有12行,这就是为什么您没有检测到代码中的错误。将示例增加到13行,您将看到警告。好的,我将回顾mapply。我在上面提供了一个工作示例和进一步的评论。我认为我的答案正是你想要的,或者我根本不了解你的问题。这很好,比我的方法要好得多。作品精美,适用于整个df。节省了我很多工作。@user2009447,很好。如果有效,你可以接受答案。
x freq
1 FALSE 10
2 TRUE 2
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
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 = 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