8

一部の列名が大文字で、一部が小文字であることを除いて、同じ列見出しのデータフレームのセットがあります。すべての列名を小文字に変換して、すべての1つの大きなデータフレームを作成できるようにします。

colnames()私はどのループでも動作したり、自分が書いたものを適用したりすることができないようです。と:

#create dfs
df1<-data.frame("A" = 1:10, "B" = 2:11)
df2<-data.frame("a" = 3:12, "b" = 4:13)
df3<-data.frame("a" = 5:14, "b" = 6:15)
#I have many more dfs in my actual data

#make list of dfs, define lowercasing function, apply across df list
dfs<-ls(pattern = "df")
lowercols<-function(df){colnames(get(df))<-tolower(colnames(get(df)))}
lapply(dfs, lowercols)

次のエラーが発生します。

Error in colnames(get(df)) <- tolower(colnames(get(df))) : 
  could not find function "get<-"

すべてのデータフレームを小文字の列名に変更するにはどうすればよいですか?

4

3 に答える 3

11

以下が機能するはずです。

dfList <- lapply(lapply(dfs,get),function(x) {colnames(x) <- tolower(colnames(x));x})

このような問題は通常、すべてのデータフレームを単一のデータ構造に配置しておらず、のような厄介なものを使用せざるを得ないという事実に起因しますget

私のコードではそうではありません。最初にデータフレームの単一のリストを実際に作成してから、それらの列名を変更するためにとをlapply使用します。get

また、lowercols関数はRに似ていないことに注意する必要があります。R関数は通常、何も返さないように呼び出されることはありませんが、副作用があります。そのように関数を書き込もうとすると(これは可能です)、おそらく人生を困難にし、スコーピングの問題を抱えることになります。lapply2番目に、変更されたデータフレームを明示的に返すことに注意してください。

于 2012-04-15T22:18:56.497 に答える
4

@joranの答えは、スタイルと「おそらくこれを別の方法でやりたい」というメッセージの両方で、私のものと大きく重なっています。しかし、「人に魚を与えて、あなたは彼に一日餌をやる。彼に鋭い棒を与えると、彼は目を突くことができる」という精神で...

これがあなたがやりたい(あなたが思う)方法であなたがやりたいことをする関数です:

dfnames <- ls(pattern = "df[0-9]+")  ## avoid 'dfnames' itself
lowercolnames <- function(df) {
    x <- get(df)
    colnames(x) <- tolower(colnames(x))
    ## normally I would use parent.frame(), but here we
    ##  have to go back TWO frames if this is used within lapply()
    assign(df,x,sys.frame(-2))
    ## OR (maybe simpler)
    ## assign(df,x,envir=.GlobalEnv)

    NULL
}

列名を小文字にして結果を返す2つの代替関数を次に示します。

lowerCN2 <- function(x) {
    colnames(x) <- tolower(colnames(x))
    x
}

完全を期すためにここに含めplyr::renameますが、この場合、実際には価値があるよりも厄介です。

lowerCN3 <- function(x) {
    plyr::rename(x,structure(tolower(colnames(x)),
                             names=colnames(x)))
}

dflist <- lapply(dfnames,get)
dflist <- lapply(dflist,lowerCN2)
dflist <- lapply(dflist,lowerCN3)
于 2012-04-15T22:31:47.923 に答える
1

これはあなたの質問に直接答えるものではありませんが、あなたが解決しようとしている問題を解決するかもしれません。次のような方法で、異なる名前のdata.framesをマージできます。

df1 <- data.frame("A" = 1:10, "B" = 2:11, x=letters[1:10])
df2 <- data.frame("a" = 3:12, "b" = 4:13, y=LETTERS[1:10])
merge(df1, df2, by.x=c("A","B"), by.y=c("a","b"), all=TRUE)
于 2012-04-16T01:19:22.063 に答える