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