如果这是重复,我道歉,我无法在任何地方找到它。
说我有一堆数据框,我想将他们所有的列名转换为小写。什么是最有效的方法呢? assign
和get
很简单,但我想知道是否有更快的方式?
如果我刚刚获得ChickWeight
和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)
答案 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)))
我想强调的是,与原始帖子中提供的简单方法相比,不一定更快或更透明。