如何在R括号表示法中使用函数变量?

时间:2012-09-01 08:29:01

标签: r plyr

我正在尝试计算一些简单的比率,并使用R的括号表示法来表示该比率的基线。

现在我正在努力定义一个允许我参数化基线的函数。 我不想硬编码,因为我有几个。并且,我真的不明白R正在做什么,并且非常好奇如何实现所期望的行为。

这里有一些基于示例数据的代码:

data("singer", package = "lattice")

# this is what I want, but what currently doesn't work
my_ratio <- function(voice) {
  ddply(singer, ~ voice.part,
        transform,
        # how do I refer to the voice variable here?
        # it looks like it misunderstands it as column?
        ratio = height / mean(height[voice.part == voice]))
}

# this version works with a hardcoded voice part
my_ratio_hard <- function() {
  ddply(singer, ~ voice.part,
        transform,
        ratio = height / mean(height[voice.part == "Soprano 1"]))
}

2 个答案:

答案 0 :(得分:1)

这不是我正在寻找的,但在其他情况下可能会有所帮助。

在询问问题后我找到了something

为了能够引用变量,而不是数据框,对象等的一部分,可以使用点括号表示法:.(voice)是解决方案。因此,正确的函数定义如下:

my_ratio <- function(voice) {
  ddply(singer, ~ voice.part,
        transform,
        ratio = height / mean(height[voice.part == .(voice)]))
}

但是,它不会产生与使用文字字符串相同的行为。

答案 1 :(得分:1)

这个怎么样:

my_ratio <- function(voice) {
  my_transform <- function(x) {
    transform(x, ratio = height / mean(height[voice.part == voice]))
  }
  ddply(singer, ~voice.part, my_transform)
}

您真的只想缩放与voice匹配的行并在其他地方使用NaN(这也是您的硬编码函数的作用)吗?

上述更紧凑的版本:

my_ratio <- function(voice) {
  ddply(singer, ~voice.part, 
    function(x) transform(x, ratio = height/mean(height[voice.part == voice])))
}

如果你真的想缩放所有记录(正如你的评论所示):

my_ratio <- function(voice) {
  scale <- with(singer, mean(height[voice.part == voice]))
  ddply(singer, ~voice.part, 
    function(x) transform(x, ratio = height / scale))
}