gpt4 book ai didi

r - 通过与列名中的模式匹配的 data.frame 的不同列迭代函数

转载 作者:行者123 更新时间:2023-12-04 18:43:55 25 4
gpt4 key购买 nike

我想通过 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 可以自己设置为变量,但目前我不需要这样做。

谢谢
朱利亚

最佳答案

你基本上已经掌握了。只需使用 apply在子集数据的列上到 apply功能 f在列上(2 的第二个参数中的 apply 表示列,而 1 表示在行上 apply):

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

或者,如果您不想强制您的 dfmatrix (这将发生在 apply 中)您可以使用 lapply正如您以几乎相同的方式建议的那样...
lapply( df[,grep("abc", colnames(df))] , f )

来自 lapply 的返回值将是一个列表,每一列都有一个元素。您可以将其转回 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"

第二次编辑

对于您要运行的示例函数,将其重写为采用 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) ) ] ) 

关于r - 通过与列名中的模式匹配的 data.frame 的不同列迭代函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18252941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com