2015-11-06 17 views
5

lapplyをデータフレームのリストに使用しようとしています。パラメータを正しく渡すことに失敗した(私は思う)。データフレームのlapplyを使用してデータフレームのリストの列名を変更する

一覧:列名を持つ

df1 <- data.frame(A = 1:10, B= 11:20) 
df2 <- data.frame(A = 21:30, B = 31:40) 

listDF <- list(df1, df2,df3) #multiple data frames w. way less columns than the length of vector todos 

ベクター:

todos <-c('col1','col2', ......'colN') 

私はlapply使用して列名を変更したい:

lapply (listDF, function(x) { colnames(x)[2:length(x)] <-todos[1:length(x)-1] } ) 

が、このdoesnの名前を全く変えないでください。データフレーム自体を渡すのではないですか?結果を新しいオブジェクトに返さないように、名前を変更したいだけです。

ありがとうございます。

+0

値であるため* Rの呼び出し動作しないであろう* – jogo

+1

だけ(listDF、関数(X){COLNAMES(X)[2:長さ(X)] lapply '末端に 'X'を追加< -todos [1:length(x)-1]; x}) '。書かれた関数に戻り値がありません。 –

+1

質問には関係しませんが、 '1:length(x)-1'は一般的なエラーです(時には有害ではない場合もあります)。正しい行は '1:(length(x)-1)'です(注意が必要です) – nicola

答えて

11

あなたはすべての列

df1 <- data.frame(A = 1:10, B= 11:20) 
df2 <- data.frame(A = 21:30, B = 31:40) 

listDF <- list(df1, df2) 
new_col_name <- c("C", "D") 

lapply(listDF, setNames, nm = new_col_name) 
## [[1]] 
##  C D 
## 1 1 11 
## 2 2 12 
## 3 3 13 
## 4 4 14 
## 5 5 15 
## 6 6 16 
## 7 7 17 
## 8 8 18 
## 9 9 19 
## 10 10 20 

## [[2]] 
##  C D 
## 1 21 31 
## 2 22 32 
## 3 23 33 
## 4 24 34 
## 5 25 35 
## 6 26 36 
## 7 27 37 
## 8 28 38 
## 9 29 39 
## 10 30 40 

を交換したい場合は、あなたが列名のサブセットのみを交換する必要がある場合は、することができますsetNamesを使用することができます1 - B:(B - 1)

@Jogo

lapply(listDF, function(df) { 
    names(df)[-1] <- new_col_name[-ncol(df)] 
    df 
}) 

最後のポイントの溶液を使用し、Rに差があります

1:10 - 1 
## [1] 0 1 2 3 4 5 6 7 8 9 

1:(10 - 1) 
## [1] 1 2 3 4 5 6 7 8 9 

EDIT

リストから地球環境にdata.frameの列名を変更したい場合は、list2envを使用することができますが、私はそれはあなたが欲しい達成するための最良の方法であるか分かりません欲しいです。また、リストを変更して名前付きリストを使用する必要がある場合は、名前を交換する必要があるdata.frameの名前と同じ名前にする必要があります。

listDF <- list(df1 = df1, df2 = df2) 

new_col_name <- c("C", "D") 

listDF <- lapply(listDF, function(df) { 
    names(df)[-1] <- new_col_name[-ncol(df)] 
    df 
}) 

list2env(listDF, envir = .GlobalEnv) 
str(df1) 
## 'data.frame': 10 obs. of 2 variables: 
## $ A: int 1 2 3 4 5 6 7 8 9 10 
## $ C: int 11 12 13 14 15 16 17 18 19 20 
+0

出力とOPコードを確認してください。 'colnames(x)[2:length(x)]'行は、置換が第2列から始まることを示します。 –

+0

@PierreLafortuneおかげピエールは、私はいくつかのadjustement – dickoa

+0

申し訳dickoaをしたが、lapply列名のみ*内側*リスト変化し、正しい(そうDF1とDF2まだ元の鞍部を持っている。名前を!!)。私はまたピエールから 'x'を追加しようとしましたが、それでもトリックはしません。 私は、リストの中で変更をしたいのではなく、リストを使ってDFの長いリストを保持します。何か案は?おかげ – user3310782

1

はこれを試してみてください。

lapply (listDF, function(x) { 
    names(x)[-1] <- todos[-length(x)] 
    x 
}) 

あなたが変更されたデータフレームを使用して新しいリストを取得します。あなたが直接listDFを操作したい場合:

for (i in 1:length(listDF)) names(listDF[[i]])[-1] <- todos[-length(listDF[[i]])] 
+0

jogoありがとうございます。なぜデータフレームの列名が変わらないのですか?これは、リスト内の列名を変更するだけで、独立したDFでは変更しません。 – user3310782

+0

でも 'listDF < - lapply(...)'を実行することができます – jogo

+0

確かに、DF列名を変更したい場合は、lapplyでは行かないのですか? – user3310782

関連する問題