我目前正试图通过在功能的帮助下重写一些部分来使我的代码干燥。我正在使用的功能之一是:
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)
答案 0 :(得分:1)
通常,最好不要将数据/变量嵌入到对象的名称中。因此,不要使用assign
到dataHarvard
,而是使用名为“哈佛”的元素制作列表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。