2

私のプログラムは data.frame を取り、数値を計算します。ある時点で、j 番目の列の値に、列名 (実際には種の名前 - 生態学的インデックス) に依存する定義済みの値が乗算されます。これまでのところ、列名を一致させることにより、2 番目の data.frame を介してこれらの値を提供してきました。関数内で固定変数値を統合する効率的な方法は何ですか? 2 番目の data.frame ファイルを必要とせずに、プログラムをできるだけ移植できるようにしたいと考えています。

編集

これが関数です。外部ソースに依存しないように、2 行目 (index <- read.table...) を改善しようとしています。

macroIndex <- function(obj, index) {
    index <- read.table("conv.csv", header=T, dec=",")
    a <- c()
    b <- names(obj)
    for (i in 2:length(obj)) {
        obj[i] <- obj[i] * index[which(index==b[i]), 2]
    }
    obj
}

私が試した別の解決策は、きれいに見えないかもしれませんが、仕事を成し遂げます。dput(index) を使用して永続オブジェクトを作成し、それを関数に挿入します。

4

4 に答える 4

1

さて、列名を別の値にマップする必要があるため、何らかの方法で保存する必要があります。名前付きリストの方が適切なデータ構造だと思いますが、結局のところ大きな違いはありません。

サンプルデータは次のとおりです。

df <- data.frame(a=1:5, b=2:6)
mapping <- list(a=3, b=4)

リストを使用した簡単な例を次に示します。

for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]]

マトリックスを使用するための Tal の推奨事項について: データ フレーム内のすべての値が同じタイプである限り、これは当てはまります。タイプが混在している場合は、データ フレームに固執する必要があります。

于 2010-04-24T13:57:59.000 に答える
1

2 番目のデータ フレームをパラメーターとして関数呼び出しに含めてから、それが指定されているかどうかを確認し、指定されていない場合は手動で作成します。このようにして、コードは現在行っていることと一致するデータセットに対して機能しますが、次のように変更できます。新しいデータセットに一致します。

のようなもの(申し訳ありませんが、私は自分のPCにいないので、これはテストされていません)

macroIndex <- function(obj, index) {
  if(!exists(index)) {
    index <- data.frame(# contents of the default data frame here )
  }
  a <- c()
  b <- names(obj)
  for (i in 2:length(obj)) {
      obj[i] <- obj[i] * index[which(index==b[i]), 2]
  }
  return(obj)
}
于 2010-04-25T08:32:03.773 に答える
1

R の字句スコープを使用してfunction_maker、目的の関数を返す関数を定義できますfunc。マッピング ベクトルを作成するコードは、が呼び出されたときにのみ呼び出され、が呼び出されたときfunction_makerは呼び出されませんfunc。また、コードの他の部分で変更できないという点でmapping所有されています。func

dat <- data.frame(a=c(1,2,3),b=c(3,2,0),c=c(5,6,4))

function_maker <- function(){
    mapping <- c(a=4,b=2,c=5)
    function(df){
        for(i in 1:ncol(df)) df[,i] <- df[,i] * mapping[[colnames(df)[i]]]
        return(df)
    }
}

func <- function_maker()

func(dat)
于 2010-04-24T18:08:34.820 に答える
0

1) data.frame の代わりにマトリックスに移行することを検討してください - より高速な結果が得られます。

2)達成したいことを説明する簡単なコードを提供していただけますか?

于 2010-04-24T08:27:57.830 に答える