65

ファイルをインポートした後は、列名を簡単に参照できるように、常に列名からスペースを削除するようにしています。

変換を使用してから、このコマンドが作成する余分な列を削除する以外に、これを行うためのより良い方法はありますか?

これは私が今使っているものです:

names(ctm2)
#tranform function does this, but requires some action
ctm2<-transform(ctm2,dymmyvar=1)
#remove dummy column
ctm2$dymmyvar <- NULL
names(ctm2)
4

13 に答える 13

78

その目的のためのよりエレガントで一般的な解決策があります:

tidy.name.vector <- make.names(name.vector, unique=TRUE)

make.names()文字ベクトルから構文的に有効な名前を作成します。構文的に有効な名前は、文字、数字、およびドットまたは下線文字で構成され、文字またはドットの後に数字が続かない状態で始まります。

さらに、フラグunique=TRUEを使用すると、新しい列名で重複する可能性を回避できます。

実装するコードとして

d<-read_delim(urltxt,delim='\t',)
names(d)<-make.names(names(d),unique = TRUE)
于 2014-08-06T06:26:17.637 に答える
36

そのための非常に便利なパッケージがあります。これは、janitor列名のクリーンアップを非常に簡単にするというものです。すべての一意の文字を削除し、スペースを。に置き換えます_

library(janitor)

#can be done by simply
ctm2 <- clean_names(ctm2)

#or piping through `dplyr`
ctm2 <- ctm2 %>%
        clean_names()
于 2018-11-30T14:37:09.933 に答える
35

各列の最初のスペースのみを置き換えるには、次のこともできます。

names(ctm2) <- sub(" ", ".", names(ctm2))

または、すべてのスペースを置き換える(もう少し便利なようです):

names(ctm2) <- gsub(" ", "_", names(ctm2))

または、最初の回答で述べたように(ただし、すべてのスペースを修正する方法ではありません):

spaceless <- function(x) {colnames(x) <- gsub(" ", "_", colnames(x));x}
newDF <- spaceless(ctm2)

ここで、xはdata.frameの名前です。「。」の問題を回避するために、「_」を使用することを好みます。IDの一部として。

重要なのは、gsubはパターンマッチの最初のインスタンスで停止しないということです。

于 2012-05-21T15:34:21.243 に答える
11

このように名前を付けます。これが最適です。名前のすべての空白がアンダースコアに置き換えられます。

names(ctm2)<-gsub("\\s","_",names(ctm2))

于 2017-08-15T19:39:18.580 に答える
9

私がこれまでに見つけた最善の解決策は

names(ctm2) %<>% stringr::str_replace_all("\\s","_") %>% tolower

クレジットはコメント投稿者やその他の回答に送られます

于 2018-07-02T15:55:32.760 に答える
9

dplyr::select_all()列名を再フォーマットするために使用できます。この例では、スペースとピリオドをアンダースコアに置き換え、すべてを小文字に変換します。

iris %>%  
  select_all(~gsub("\\s+|\\.", "_", .)) %>% 
  select_all(tolower) %>% 
  head(2)
  sepal_length sepal_width petal_length petal_width species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
于 2018-07-04T11:39:51.237 に答える
4

または、stringrパッケージで同じ結果が得られる場合があります。

names(ctm2) <- names(ctm2) %>% stringr::str_replace_all("\\s","_")

于 2017-08-15T19:51:34.657 に答える
4

dplyrデータフレームの作成後に列の名前を変更するよりも、1つのコードチャンク内で列の名前を変更すると便利なことがよくあります。配管はrename_all()、次のような状況で非常に役立ちます。

ctm2 %>% rename_all(function(x) gsub(" ", "_", x))

上記のコードは、すべての列名のすべてのスペースをアンダースコアに置き換えます。

于 2020-01-20T21:30:40.057 に答える
4

2021年1月現在:簡潔で追加のライブラリを使用しないdrplyrソリューションは

df %<>% dplyr::rename_all(make.names)

クレジットはコメンターに送られます。

于 2021-01-15T14:41:56.760 に答える
3

data.tableの列名のスペースを削除する簡単な方法があります。データフレームをデータテーブルに変換する必要があります。

setnames(x=DT, old=names(DT), new=gsub(" ","",names(DT)))

Country Codeに変換されますCountryCode

于 2016-09-02T10:46:48.993 に答える
2

に割り当てるだけnames(ctm2)

  names(ctm2) <- c("itsy", "bitsy", "eeny", "meeny")

またはデータ駆動型の方法で:

  names(ctm2) <- paste("myColumn", 1:ncol(ctm2), sep="")

別の可能性は、ソースファイルを編集することです...

于 2012-05-21T15:30:32.873 に答える
1

Rでmake名とgsub関数を組み合わせて使用​​することもできます。

names(ctm2)<- gsub("\\.","_", make.names(names(ctm2), unique = T))

上記のコードは、一度に2つのことを実行します。

  1. すべての列に一意の名前が作成されます。たとえば、同じ名前が一意に変換されます。たとえば、c( "ab"、 "ab")はc( "ab"、 "ab2")に変換されます。
  2. ドットがアンダースコアに置き換えられます。ドットのある列名と比較して、アンダースコアのある列名を選択しようとすると(名前をダブルクリックするだけで)簡単になります。ドット付きの列名を選択するのは非常に困難です。
于 2019-05-02T12:31:25.183 に答える
-1

read.csv()を使用してデータをインポートする場合(すべてのスペース ""を"。"に置き換えます)、代わりに以下を使用してアンダースコア"_"に置き換えることができます。

names(df) <- gsub("\\.", "_", names(df))
于 2020-03-12T00:21:26.567 に答える