5

data.frame のさまざまな列 (列名に共通のパターンを持つ) で関数を反復処理したいと考えています。data.frame をサブセット化するために、機能する次のコードを使用します。

df[,grep("abc", colnames(df))]

しかし、for ループまたは lapply 関数を使用して、このパターンに一致するすべての列に関数 f(x) を適用する方法がわかりません。

私が使用している機能は次のとおりです。

compress= function(x) {
  aggregate(df[,x,drop=FALSE],
        list(hour = with(df,paste(dates(Time),
                                         sprintf("%d:00:00",hours(Time))))),
        sum,na.rm=TRUE)
}

ここで、df (データ フレーム) と Time は変数自体として設定できますが、今のところその必要はありません。

ありがとうジュリア

4

1 に答える 1

6

あなたは基本的にそれを手に入れました。applyサブセット化されたデータの列を使用して、列に対してapply機能fするだけです (2の 2 番目の引数のapplyは列を示します。これは、行を超える1ことを示します)。apply

apply( df[,grep("abc", colnames(df))] , 2 , f )

dfまたは、matrix(で発生するapply)に強制したくない場合はlapply、ほぼ同じ方法で提案どおりに使用できます...

lapply( df[,grep("abc", colnames(df))] , f )

からの戻り値はlapply、各列に 1 つの要素を持つリストになります。呼び出しを でラップdata.frameすることにより、これを に戻すことができます。lapplydata.framedata.frame( lapply(...) )

# This function just multiplies its argument by 2
f <- function(x) x * 2

df <- data.frame( AB = runif(5) , AC = runif(5) , BB = runif(5) )


apply( df[,grep("A", colnames(df))] , 2 , f )
#            AB        AC
#[1,] 0.4130628 1.3302304
#[2,] 0.2550633 0.1896813
#[3,] 1.5066157 0.7679393
#[4,] 1.7900907 0.5487673
#[5,] 0.7489256 1.6292801


data.frame( lapply( df[,grep("A", colnames(df))] , f ) )
#         AB        AC
#1 0.4130628 1.3302304
#2 0.2550633 0.1896813
#3 1.5066157 0.7679393
#4 1.7900907 0.5487673
#5 0.7489256 1.6292801

# Note the important difference between the two methods...
class( data.frame( lapply( df[,grep("A", colnames(df))] , f ) ) )
#[1] "data.frame"
class( apply( df[,grep("A", colnames(df))] , 2 , f ) )
#[1] "matrix"

2回目の編集

実行したいサンプル関数については、dfを入力として受け取り、操作対象の列名のベクトルとして書き直す方が簡単かもしれません。この例では、関数はリストを返します。そのリストの各要素には、集約された が含まれていますdata.frame

compress= function( df , x ) {
  lapply( x , function(x){
  aggregate(df[,x,drop=FALSE],
        list(hour = with(df,paste(dates(Time),
                                         sprintf("%d:00:00",hours(Time))))),
        sum,na.rm=TRUE)
    }
  )
}

関数を実行するには、それを呼び出して、data.frame と colnames のベクトルを渡します...

compress( df , names(df)[ grep("abc", names(df) ) ] ) 
于 2013-08-15T12:49:42.353 に答える