R 带参数的lappy函数,我想从带有循环的数据帧中选取参数
我对R还是很陌生,到目前为止还没有找到任何答案。很抱歉最后问你 带一个快速示例的版本: 我想计算一个基于南非数据的多维发展指数。 我的列表由每年的个人信息组成,因此基本上df1是关于第一年的,df2是关于第二年的R 带参数的lappy函数,我想从带有循环的数据帧中选取参数,r,loops,dataframe,lapply,R,Loops,Dataframe,Lapply,我对R还是很陌生,到目前为止还没有找到任何答案。很抱歉最后问你 带一个快速示例的版本: 我想计算一个基于南非数据的多维发展指数。 我的列表由每年的个人信息组成,因此基本上df1是关于第一年的,df2是关于第二年的 df1<-data.frame(var1=c(1, 1,1), var2=c(0,0,1), var3=c(1,1,0)) df2<-data.frame(var1=c(1, 0,1), var2=c(1,0,1), var3=c(0,1,0)) mylist <-l
df1<-data.frame(var1=c(1, 1,1), var2=c(0,0,1), var3=c(1,1,0))
df2<-data.frame(var1=c(1, 0,1), var2=c(1,0,1), var3=c(0,1,0))
mylist <-list (df1,df2)
非常感谢你的帮助 好的,我不喜欢你的
mydf
名称,也不喜欢它有因子,所以我把它重命名为args
,因为它有函数参数,我设置了stringsafactors=F
:
args <- data.frame(set1=c("var1", "var2"), set2=c("var2", "var3"), stringsAsFactors = F)
然后我们可以像这样嵌套lappy
:
lapply(mylist, function(m) lapply(args, myindex2, x = m))
# $df1
# $df1$set1
# [1] 4
#
# $df1$set2
# [1] 3
#
#
# $df2
# $df2$set1
# [1] 4
#
# $df2$set2
# [1] 3
也许可以使用
mapply
,这对迭代多个参数很好?或者重写fun
以期望列表(arg1,arg2)
作为第二个参数?如果没有一个小的可重复的示例,没有几行数据
,没有一个示例mylist
,很难判断。似乎pick\u values
并没有做任何有用的事情,似乎lappy(data,pick\u values)
是as.list(data)
的低效版本。谢谢Gregor的回答。我用一个简单的例子编辑了我的文本,使其更容易获取。好吧,要清楚的是,在mydf
中有两列,在mylist
中有两个数据框,所以您希望得到一个包含2*2=4个评估的列表?是的,确实如此!)您希望结果完全嵌套吗?例如,你可以有一个结果列表,它的结构是(a)results=list(df1=list(set1,set2),df2=list(set1,set2))
,或者(b)list(set1=list(df1,df2),set2=(df1,df2))
,或者(c)一个平面结构list(df1_set1,df1_set2,df2_set2)
,再次感谢你,格雷戈,这真的很有帮助。也就是说,我不明白嵌套的lappy函数是如何工作的。我正在寻找关于这些嵌套函数的好教程!:)My outer apply将函数应用于mylist
的每个项目。我应用什么功能?任意函数函数(m)lappy(args,myindex2,x=m)
,注意内部lappy
不适用于m
,它应用于args
的每个元素,并使用m
的当前值作为参数。如果外部循环是for(mylist中的m){for(args中的a){myindex2(x=m,d=a)}
,并且设置了一个方便的列表容器来捕获结果,那么这与嵌套for循环是相同的。非常感谢,这就是我最终设法弄明白的。但更好的是,如果解释得当:)你的尝试没有成功,因为没有筑巢。您有lappy(mylist,FUN=myindex,…=lappy(mydf,pick_值))
,这相当于a=lappy(mydf,pick_值);对于(mylist中的m){myindex(m,a)}
,和a
只是将不同迭代中需要的所有参数集中在一起。
pick_values <-function(x){
vect <-c()
for(i in x){
vect <- c(vect, i)
}
return(vect)
}
lapply(mylist, myindex, lapply(mydf,pick_values))
args <- data.frame(set1=c("var1", "var2"), set2=c("var2", "var3"), stringsAsFactors = F)
myindex2 = function(x, d) {
myindex(x, d[1], d[2])
}
lapply(mylist, function(m) lapply(args, myindex2, x = m))
# $df1
# $df1$set1
# [1] 4
#
# $df1$set2
# [1] 3
#
#
# $df2
# $df2$set1
# [1] 4
#
# $df2$set2
# [1] 3