什么是在多个数据帧上执行相同操作的最有效方法?

时间:2013-01-03 17:03:35

标签: r dataframe

如果这是重复,我道歉,我无法在任何地方找到它。

说我有一堆数据框,我想将他们所有的列名转换为小写。什么是最有效的方法呢? assignget很简单,但我想知道是否有更快的方式?

如果我刚刚获得ChickWeightmtcars,则非动态操作只会是......

names( ChickWeight ) <- tolower( names( ChickWeight ) )
names( mtcars ) <- tolower( names( mtcars ) )

..然后这就是我如何让这个过程变得动态,但我想知道是否有更高效的解决方案?

# column headers contain uppercase
head(ChickWeight)

# start with a vector of data frame names..
# this might contain many, many data frames
tl <- c( 'ChickWeight' , 'mtcars' )

# loop through each data frame name..
for ( i in tl ){
    # save it to a temporary object name
    x <- get( i )

    # main operations here..

    # perform the operation(s) you want to run on each data frame
    names( x ) <- tolower( names( x ) )

    # ..end of main operations


    # assign the updated data frame to overwrite the original data frame
    assign( i , x )
}

# no longer contains uppercase
head(ChickWeight)

1 个答案:

答案 0 :(得分:1)

我认为你不可能通过改变方法获得很大的速度。更强大的惯用方法是将所有数据框存储在列表中并使用类似`

的内容
dlist <- list(mtcars,ChickWeight)

(或)

namevec <- c("mtcars","ChickWeight")
dlist <- lapply(namevec,get)

然后:

dlist <- lapply(dlist,function(x) setNames(x,tolower(names(x))))

...但是当然为了使用这种方法,你必须承诺将数据框称为列表元素,这反过来会影响整个分析结构。如果您不想这样做,那么我看不到比get / assign方法更好的内容。

如果要将列表的值分配回全局环境,可以执行以下操作:

invisible(mapply(assign,namevec,dlist,MoreArgs=list(envir=.GlobalEnv)))

我想强调的是,与原始帖子中提供的简单方法相比,不一定更快或更透明。