【问题标题】:R Saving function output to object when using assign functionR使用分配函数时将函数输出保存到对象
【发布时间】:2018-10-12 19:57:31
【问题描述】:

我目前正试图通过在函数的帮助下重写一些部分来简化我的代码。我正在使用的功能之一是:

datasetperuniversity<-function(university,year){assign(paste("data",university,sep=""),subset(get(paste("originaldata",year,sep="")),get(paste("allcollaboration",university,sep=""))==1))}

执行函数 datasetperuniversity("Harvard","2000") 将在函数内产生如下结果:

dataHarvard=subset(originaldata2000,allcollaborationHarvard==1)

该函数几乎可以完美运行,只是它没有将结果存储在 dataHarvard 中。我读到这在函数中是正常的,使用

这里有一些数据:

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

【问题讨论】:

  • 我想如果你重新排列你的数据,它会更容易。不要随身携带originaldata2000、originaldata2001 等——只需将它们放在一个带有年份列的表中即可。如果您的 allcolaboration[uni] 列是互斥的,请使用一个分类列而不是虚拟列。如果您有兴趣了解更多关于这一思路的信息:jstatsoft.org/article/view/v059i10
  • @Frank 感谢这个非常清晰且易于实施的建议。虽然我现在会使用这种方法,但我一直想知道我最初的问题是否可以回答合并所有数据集的情况是不可取的

标签: r function paste assign


【解决方案1】:

一般来说,最好不要将数据/变量嵌入到对象的名称中。因此,不要使用assign 到dataHarvard,而是使用名为“Harvard”的元素创建一个列表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* 列是互斥的,则可以将它们折叠为具有“哈佛”、“耶鲁”等值的单个分类变量。或者,put the data in long form 可能有意义。

有关排列数据的更多指导,我推荐Hadley Wickham's tidy data paper。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 2017-01-11
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    相关资源
    最近更新 更多