あなたは基本的にそれを手に入れました。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
することにより、これを に戻すことができます。lapply
data.frame
data.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) ) ] )