5

dplyr や magrittr などのパッケージによって有効になるパイプライン メタファは非常に便利で、R でコードを読みやすくするのに非常に役立ちます (大変な作業です!)。

データ フレーム内のすべての変数の名前を事前に決定されたリストに変更することで終了するパイプラインを作成するにはどうすればよいでしょうか?

これが私が試したものです。最初に、テストする単純なサンプル データ:

> library(dplyr)    
> iris %>% head(n=3) %>% select(-Species) %>% t %>% as.data.frame -> test.data
> test.data

               1   2   3
Sepal.Length 5.1 4.9 4.7
Sepal.Width  3.5 3.0 3.2
Petal.Length 1.4 1.4 1.3
Petal.Width  0.2 0.2 0.2

これは機能しません:

> test.data %>% rename(a=1,b=2,c=3)
Error: Arguments to rename must be unquoted variable names. Arguments a, b, c are not.

のドキュメントを読んでも、このエラーの正確な意味を理解できませんでしたrename。私の別の試みでは、中かっこを使用してコード ブロックを定義することでエラーを回避していますが、名前の変更は実際には行われません。

> test.data %>% { names(.) <- c('a','b','c')}
4

3 に答える 3

5

'1','2','3'名前の変更の代わりに setNames {stats} を使用することを除いて、あなたは正しかった (zx8754 は私の前にあなたのコメントで答えた)

setNames: これは、オブジェクトに名前を設定してオブジェクトを返す便利な関数です。これは、返されるオブジェクトを作成する関数定義の最後で最も役立ちますが、名前を割り当てることができるように名前を付けて保存したくない場合に便利です。

あなたの例(setNamesで名前を変更するだけで閉じます)

iris %>% 
   head(n=3) %>% 
   select(-Species) %>% 
   t %>% 
   as.data.frame %>% 
   rename(a=1,b=2,c=3)

答え

iris %>% 
   head(n=3) %>% 
   select(-Species) %>%
   t %>%
   as.data.frame %>%
   setNames(c('1','2','3'))

もう一つの例

name_list <- c('1','2','3')

iris %>% 
   head(n=3) %>% 
   select(-Species) %>%
   t %>%
   as.data.frame %>%
   setNames(name_list)
于 2016-02-26T18:05:59.697 に答える
2

これを機能させるには、magrittr パッケージの tee オペレーターが必要でした。

> library(magrittr)
> test.data %T>% { names(.) <- c('a','b','c')} -> renamed.test.data
> renamed.test.data
               a   b   c
Sepal.Length 5.1 4.9 4.7
Sepal.Width  3.5 3.0 3.2
Petal.Length 1.4 1.4 1.3
Petal.Width  0.2 0.2 0.2

通常の (数字ではない) 変数名を持つデータ フレームの場合は、次のようにすることができます。

> # Rename it with rename in a normal pipe
> renamed.test.data %>% rename(x=a,y=b,z=c) -> renamed.again.test.data
> renamed.again.test.data
               x   y   z
Sepal.Length 5.1 4.9 4.7
Sepal.Width  3.5 3.0 3.2
Petal.Length 1.4 1.4 1.3
Petal.Width  0.2 0.2 0.2

ただし、上記のトリック (編集: または、setNames を使用するよりも優れています) は依然として有用です。なぜなら、文字ベクトルに既に名前のリストがあり、それらをすべて一度に設定したいだけで、各置換を書き出すことを心配する必要がないからです。ペア。

于 2016-02-26T16:09:46.850 に答える
2

dplyr::renameBackquote(`) で囲むことにより、数値変数名を に変更できます。

library(dplyr)

iris %>% 
  head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>%
  dplyr::rename(a=`1`, b=`2`, c=`3`)
# a   b   c
# Sepal.Length 5.1 4.9 4.7
# Sepal.Width  3.5 3.0 3.2
# Petal.Length 1.4 1.4 1.3
# Petal.Width  0.2 0.2 0.2

stats::setNames別の方法として、 、 、 magrittr::set_namesを使用して列名を設定できますpurrr::set_names

library(dplyr)
library(magrittr)
library(purrr)

iris %>% 
  head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>%
  stats::setNames(c("a", "b", "c"))

iris %>% 
  head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>%
  magrittr::set_names(c("a", "b", "c"))

iris %>% 
  head(n=3) %>% select(-Species) %>% t %>% as.data.frame %>%
  purrr::set_names(c("a", "b", "c"))
# The results of above all codes is as follows:
# a   b   c
# Sepal.Length 5.1 4.9 4.7
# Sepal.Width  3.5 3.0 3.2
# Petal.Length 1.4 1.4 1.3
# Petal.Width  0.2 0.2 0.2
于 2016-10-27T08:09:54.987 に答える