3

これが重複している場合は申し訳ありませんが、どこにも見つかりませんでした..

たくさんのデータ フレームがあり、すべての列名を小文字に変換したいとします。これを行う最も効率的な方法は何ですか?それは簡単ですが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)
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 に答える