3

如果这是重复的,我很抱歉,我在任何地方都找不到它..

假设我有一堆数据框,我想将它们的所有列名都转换为小写。最有效的方法是什么?这很简单,assignget我想知道是否有更快的方法?

如果我刚刚得到ChickWeightand mtcars,那么非动态操作将只是..

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)
4

1 回答 1

2

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

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)))

我想强调的是,这不一定比原始帖子中介绍的简单方法更快或更透明。

于 2013-01-03T17:09:47.740 回答