web-dev-qa-db-ja.com

colnames()<-

パイプ演算子を使用してcolnames()<-などの置換関数にパイプするにはどうすればよいですか?

これが私がやろうとしていることです:

library(dplyr)
averages_df <- 
   group_by(mtcars, cyl) %>%
   summarise(mean(disp), mean(hp))
colnames(averages_df) <- c("cyl", "disp_mean", "hp_mean")
averages_df

# Source: local data frame [3 x 3]
# 
#   cyl disp_mean   hp_mean
# 1   4  105.1364  82.63636
# 2   6  183.3143 122.28571
# 3   8  353.1000 209.21429

しかし、理想的には次のようになります。

averages_df <- 
  group_by(mtcars, cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  add_colnames(c("cyl", "disp_mean", "hp_mean"))

毎回特殊関数を作成せずにこれを行う方法はありますか?

ここでの答えは出発点ですが、正確には私の質問ではありません: dplyrの算術演算子の連鎖

48
Alex Coppock

colnames<-またはsetNamesを使用できます(@David Arenburgに感謝)

group_by(mtcars, cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  `colnames<-`(c("cyl", "disp_mean", "hp_mean"))
  # or
  # `names<-`(c("cyl", "disp_mean", "hp_mean"))
  # setNames(., c("cyl", "disp_mean", "hp_mean")) 

#   cyl disp_mean   hp_mean
# 1   4  105.1364  82.63636
# 2   6  183.3143 122.28571
# 3   8  353.1000 209.21429

または、Aliasからmagrittrset_colnames)を選択します。

library(magrittr)
group_by(mtcars, cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  set_colnames(c("cyl", "disp_mean", "hp_mean"))

dplyr::renameは、多くの列のうちのいくつかだけを(再)名前付けする場合に便利かもしれません(古い名前と新しい名前の両方を記述する必要があります。@ Richard Scrivenの答えを参照してください)

68
Henrik

dplyrには、列の名前を変更するいくつかの異なる方法があります。

1つは、rename()関数を使用することです。この例では、summarise()で作成された名前は式であるため、バックティックする必要があります。

_group_by(mtcars, cyl) %>%
    summarise(mean(disp), mean(hp)) %>%
    rename(disp_mean = `mean(disp)`, hp_mean = `mean(hp)`)
#   cyl disp_mean   hp_mean
# 1   4  105.1364  82.63636
# 2   6  183.3143 122.28571
# 3   8  353.1000 209.21429
_

select()を使用することもできます。列番号を使用できるため、これは少し簡単です。逆ティックをいじる必要がなくなります。

_group_by(mtcars, cyl) %>%
    summarise(mean(disp), mean(hp)) %>%
    select(1, disp_mean = 2, hp_mean = 3)
_

しかし、この例の場合、コメントで@thelatemailが言及したことを行うのが最善の方法です。つまり、1つ前の手順に戻り、summarise()の列に名前を付けることです。

_group_by(mtcars, cyl) %>%
    summarise(disp_mean = mean(disp), hp_mean = mean(hp))
_
19
Rich Scriven

次のコードのように、dplyrで.funssummarise_at引数を使用することにより、要約された変数にサフィックスを追加できます。

library(dplyr)

# summarise_at with dplyr
mtcars %>% 
  group_by(cyl) %>%
  summarise_at(
    .cols = c("disp", "hp"),
    .funs = c(mean="mean")
  )
# A tibble: 3 × 3
# cyl disp_mean   hp_mean
# <dbl>     <dbl>     <dbl>
# 1     4  105.1364  82.63636
# 2     6  183.3143 122.28571
# 3     8  353.1000 209.21429

また、いくつかの方法で列名を設定できます。

# set_names with magrittr
mtcars %>% 
  group_by(cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  magrittr::set_names(c("cyl", "disp_mean", "hp_mean"))

# set_names with purrr
mtcars %>% 
  group_by(cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  purrr::set_names(c("cyl", "disp_mean", "hp_mean"))

# setNames with stats
mtcars %>%
  group_by(cyl) %>%
  summarise(mean(disp), mean(hp)) %>%
  stats::setNames(c("cyl", "disp_mean", "hp_mean"))

# A tibble: 3 × 3
# cyl disp_mean   hp_mean
# <dbl>     <dbl>     <dbl>
# 1     4  105.1364  82.63636
# 2     6  183.3143 122.28571
# 3     8  353.1000 209.21429
8
Keiku