R使用赋值函数时将函数输出保存到对象
我目前正试图通过在函数的帮助下重写一些部分,使我的代码更加干练。我正在使用的功能之一是:R使用赋值函数时将函数输出保存到对象,r,function,paste,assign,R,Function,Paste,Assign,我目前正试图通过在函数的帮助下重写一些部分,使我的代码更加干练。我正在使用的功能之一是: datasetperuniversity<-function(university,year){assign(paste("data",university,sep=""),subset(get(paste("originaldata",year,sep="")),get(paste("allcollaboration",university,sep=""))==1))} 该函数运行几乎完美,只是它
datasetperuniversity<-function(university,year){assign(paste("data",university,sep=""),subset(get(paste("originaldata",year,sep="")),get(paste("allcollaboration",university,sep=""))==1))}
该函数运行几乎完美,只是它不将结果存储在dataHarvard中。我了解到这在函数中是正常的,通常使用,最好不要将数据/变量嵌入到对象的名称中。因此,不要使用
assign
给dataHarvard
,而是用一个名为“Harvard”的元素列出data
:
给
> data
$Harvard
sales numberofemployees allcollaborationHarvard
2 3 9 1
4 6 12 1
如图所示,您可以使用DF[[“column name”]]
访问列,而不是像操作中那样使用get
。此外,请参见?subset
中的注释:
警告
这是一个便于交互使用的功能。对于编程,最好使用标准的子集函数,如[
,尤其是参数子集的非标准求值可能会产生意想不到的结果
一般来说,如果可能的话,最好不要在列名中嵌入数据。如果allcollaboration*
列是互斥的,那么可以将它们折叠为一个带有“Harvard”、“Yale”等值的分类变量。或者,也可以选择
关于如何安排数据的更多指导,我建议。我想如果你重新安排数据,会更容易。不要随身携带
originaldata2000
、originaldata2001
,等等——只要将它们放在一个带有年份列的表中即可。如果你的allcolaboration[uni]
COL是互斥的,请使用一个分类列,而不是傻瓜。如果您感兴趣,可以了解更多关于这一思路的信息:@Frank感谢您提出的这一非常清晰且易于实施的建议。虽然我现在将使用此方法,但我一直想知道,我最初的问题是否适用于合并所有数据集的情况这不可取
sales = c(2, 3, 5,6)
numberofemployees = c(1, 9, 20,12)
allcollaborationHarvard = c(0, 1, 0,1)
originaldata = data.frame(sales, numberofemployees, allcollaborationHarvard)
# enumerate unis, attaching names for lapply to use
unis = setNames(, "Harvard")
# make a table for each subset with lapply
data = lapply(unis, function(x)
originaldata[originaldata[[ paste0("allcollaboration", x) ]] == 1, ]
)
> data
$Harvard
sales numberofemployees allcollaborationHarvard
2 3 9 1
4 6 12 1