2

私はいくつかの単純な比率を計算し、比率のベースラインを示すために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"]))
}
4

2 に答える 2

1

これは私が探していたものを実行していませんが、他のコンテキストで役立つ可能性があります。

質問をした後、私は何かを見つけました:

データフレームやオブジェクトなどの一部の代わりに変数を参照できるようにするには、ドットかっこ表記を使用できます.(voice)。これが解決策です。したがって、適切な関数定義は次のようになります。

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

ただし、リテラル文字列を使用する場合と同じ動作にはなりません。

于 2012-09-01T08:37:27.887 に答える
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))
}
于 2012-09-01T09:24:23.223 に答える