5

さまざまなデータセットに基づいて複数のグラフを作成するために、ggplotのラッパーを作成しています。関数に列名を渡すので、ggplotが参照を理解できるように、列名の名前を変更する必要があります。

ただし、データフレームの列の名前を変更するのに苦労しています

これがデータフレームです:

df <- data.frame(col1=1:3,col2=3:5,col3=6:8)

検索用の列名は次のとおりです。

col1_search <- "col1"
col2_search <- "col2"
col3_search <- "col3"

置き換える列名は次のとおりです。

col1_replace <- "new_col1"
col2_replace <- "new_col2"
col3_replace <- "new_col3"

列名を検索すると、Rは列インデックスを並べ替え、検索場所を無視します。

たとえば、次のコードを実行すると、新しいヘッダーはnew_col1、new_col2、およびnew_col3であると予想しましたが、新しい列名はnew_col3、new_col2、およびnew_col1です。

colnames(df)[names(df) %in% c(col3_search,col2_search,col1_search)] <- c(col3_replace,col2_replace,col1_replace)

列名を検索してその順序で置き換えることができるソリューションはありますか?

4

4 に答える 4

8
require(plyr)
df <- data.frame(col2=1:3,col1=3:5,col3=6:8)
df <- rename(df, c("col1"="new_col1", "col2"="new_col2", "col3"="new_col3"))
df

そして、その 2 番目の引数を創造的に作成して、renameそれほど手作業にならないようにすることができます。

于 2012-07-07T23:26:12.313 に答える
4
> names(df)[grep("^col", names(df))] <- 
                        paste("new", names(df)[grep("^col", names(df))], sep="_")
> names(df)
[1] "new_col1" "new_col2" "new_col3"

列名の順序付けられたセットを任意の文字ベクトルに置き換えたい場合、これは機能するはずです。

names(df)[sapply(oldNames, grep, names(df) )] <- newNames

( sapply)-edgrepは、「newNames」ベクトルの適切な場所を示します。これを関数に組み込む場合は、完全な一致セットがあることを確認したいと思うかもしれません。

于 2012-07-06T19:12:42.203 に答える
2

うーん、これは複雑な方法かもしれませんが、最初に頭に浮かぶのは次のとおりです。

lookup <- data.frame(search = c(col3_search,col2_search,col1_search),
                     replace = c(col3_replace,col2_replace,col1_replace))

colnames(df) <- lookup$replace[match(lookup$search, colnames(df))]
于 2012-07-06T18:17:43.033 に答える
1

私は@justinのaes_stringの提案に二番目です。ただし、将来の名前変更のために試すことができます。

require(stringr)
df <- data.frame(col1=1:3,col2=3:5,col3=6:8)
oldNames <- c("col1", "col2", "col3")
newNames <- c("new_col1", "new_col2", "new_col3")
names(df) <- str_replace(string=names(df), pattern=oldNames, replacement=newNames)
于 2012-07-06T19:15:34.703 に答える