你基本上已经掌握了。只需apply
在子集数据的列上使用以在列上apply
运行f
(2
在第二个参数中apply
指示列,而不是1
指示apply
在行上):
apply( df[,grep("abc", colnames(df))] , 2 , f )
或者,如果您不想强迫您df
使用 a matrix
(这将发生apply
),您可以lapply
按照您的建议以几乎相同的方式使用...
lapply( df[,grep("abc", colnames(df))] , f )
from 的返回值lapply
将是一个列表,每一列都有一个元素。data.frame
您可以通过用 a 包装lapply
呼叫将其转回a 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"
第二次编辑
对于您要运行的示例函数,将其重写为一个函数可能更容易,该函数接受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) ) ] )