1. ホーム
  2. r

dplyrは、それぞれの変数をリストアップすることなく、複数の変数を要約することができますか?[重複].

2023-10-04 14:58:41

質問

dplyrは驚くほど高速ですが、私は何かを見逃しているのでしょうか:複数の変数にわたって要約することが可能です。 例えば

library(dplyr)
library(reshape2)

(df=dput(structure(list(sex = structure(c(1L, 1L, 2L, 2L), .Label = c("boy", 
"girl"), class = "factor"), age = c(52L, 58L, 40L, 62L), bmi = c(25L, 
23L, 30L, 26L), chol = c(187L, 220L, 190L, 204L)), .Names = c("sex", 
"age", "bmi", "chol"), row.names = c(NA, -4L), class = "data.frame")))

   sex age bmi chol
1  boy  52  25  187
2  boy  58  23  220
3 girl  40  30  190
4 girl  62  26  204

dg=group_by(df,sex)

この小さなデータフレームを使えば、次のように簡単に書くことができます。

summarise(dg,mean(age),mean(bmi),mean(chol))

そして、欲しいものを手に入れるために、溶かして、手段を手に入れて、次のようなディキャストをすることができることを知っています。

dm=melt(df, id.var='sex')
dmg=group_by(dm, sex, variable); 
x=summarise(dmg, means=mean(value))
dcast(x, sex~variable)

しかし、もし私が>20の変数と非常に多くの行を持っている場合はどうなりますか。 グループ化されたデータフレーム内のすべての変数の平均を取ることができるような、data.tableの.SDに似たものはありますか? または、グループ化されたデータフレームでどうにかしてlapplyを使用することは可能でしょうか?

どんな助けでもありがとうございます。

どのように解決するのですか?

この data.table という熟語は lapply(.SD, mean) である。

DT <- data.table(df)
DT[, lapply(.SD, mean), by = sex]
#     sex age bmi  chol
# 1:  boy  55  24 203.5
# 2: girl  51  28 197.0

がよくわからないのですが dplyr というイディオムがありますが、次のようなことができます。

dg <- group_by(df, sex)
# the names of the columns you want to summarize
cols <- names(dg)[-1]
# the dots component of your call to summarise
dots <- sapply(cols ,function(x) substitute(mean(x), list(x=as.name(x))))
do.call(summarise, c(list(.data=dg), dots))
# Source: local data frame [2 x 4]

#    sex age bmi  chol
# 1  boy  55  24 203.5
# 2 girl  51  28 197.0

なお、githubの課題として #178 を効率的に実装するために plyr イディオム colwisedplyr .