R使用赋值功能时保存功能输出到对象

时间:2018-05-02 16:16:54

标签: 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(&#34; Harvard&#34;,&#34; 2000&#34;)会在函数中产生如下内容:

dataHarvard=subset(originaldata2000,allcollaborationHarvard==1)

该函数几乎完美运行,但它不会将结果存储在dataHarvard中。我读到这在函数中是正常的,使用&lt;&lt; - 而不是=可以解决这个问题,但是由于我正在使用assign函数,这实际上是不可能的,因为=只是结果分配功能。

这里有一些数据:

sales = c(2, 3, 5,6) 
numberofemployees = c(1, 9, 20,12) 
allcollaborationHarvard = c(0, 1, 0,1) 
originaldata = data.frame(sales, numberofemployees, allcollaborationHarvard)

1 个答案:

答案 0 :(得分:1)

通常,最好不要将数据/变量嵌入到对象的名称中。因此,不要使用assigndataHarvard,而是使用名为“哈佛”的元素制作列表data

# 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

如此处所示,您可以使用DF[["column name"]]来访问列,而不是像OP中那样get。另请参阅?subset中的注释:

  

警告

     

这是一种便于交互使用的便利功能。对于编程,最好使用像[这样的标准子集函数,特别是对参数子集的非标准评估可能会产生意想不到的后果。

通常,如果可能的话,最好不要在列名中嵌入数据。如果allcollaboration*列是互斥的,则可以将它们折叠为单个分类变量,其值为“Harvard”,“Yale”等。或者,它可能对put the data in long form有意义。

有关排列数据的更多指导,建议Hadley Wickham's tidy data paper