Rで変数をグループ化/標準化する方法は?


9

私は精通してる機能は、スケールをベースRから再スケール ARMから。

おそらく、最良の方法は、グループ化変数として使用する1つ以上の変数を指定して、applyのバリアントを使用することです。


試す:aggregate(state.x77、list(Region = state.region、Cold = state.x77 [、 "Frost"]> 130))、function(x)((x-mean(x))/ sd(x) ))
suncoolsu 2011

回答:


7

これは可能なplyrソリューションです。ベースtransform()関数に依存していることに注意してください。

my.df <- data.frame(x=rnorm(100, mean=10), 
                    sex=sample(c("M","F"), 100, rep=T), 
                    group=gl(5, 20, labels=LETTERS[1:5]))
library(plyr)
ddply(my.df, c("sex", "group"), transform, x.std = scale(x))

(たとえば、で期待どおりに動作するかどうかを確認できますwith(subset(my.df, sex=="F" & group=="A"), scale(x))

基本的に、2番目の引数はデータを「分割」する方法を示し、3番目の引数は各チャンクに適用する関数を示します。上記はx.stddata.frameに変数を追加します。x元の変数をスケーリングされた変数に置き換える場合に使用します。



3

これがdata.tableソリューションです。plyrよりも明らかに高速です(大規模なデータセットにのみ関連します)。多分後で私はdplyrの例をやります。

# generate example data
raw.data <- data.frame( outcome = c(rnorm(500, 100, 15), rnorm(500, 110, 12)), 
                        group = c(rep("a", 500), rep("b", 500)))

library(data.table)
# convert dataframe to data.table
raw.data <- data.table(raw.data, key = "group")

# create group standardized outcome variable
raw.data[ , group_std_outcome := (outcome - mean(outcome, na.rm = TRUE)) /  
           sd(outcome, na.rm = TRUE), "group"]

(はい、私がRの初心者だったときに何年も前に尋ねた質問を再発見しました;)


2

tapplyこれには(特に)を使用できます(plyrパッケージには、特定の状況により適した他の多くのオプションが含まれています)。

tapply(variabletoscale, list(groupvar1, groupvar2), scale)

1
2つの要素があるため、data.frameは返されません。そのために結果を後処理する必要があります。
2011

0

この回答は、Mahmood Araiによるホワイトペーパーからです。これには、中央揃えの結果にプレフィックス「C」でラベルを付けるという便利な副作用があります。

gcenter <- function(df1,group) {
        variables <- paste(
              rep("C", ncol(df1)),  colnames(df1), sep=".")
        copydf <- df1
        for (i in 1:ncol(df1)) {
              copydf[,i] <- df1[,i] - ave(df1[,i], group, FUN=mean)}
        colnames(copydf) <- variables
        return(cbind(df1,copydf))}

0

ここで使用して更新の実装であるdplyrからtidyverse

library(tidyverse)

my.df <- data.frame(x=rnorm(100, mean=10), sex=sample(c("M","F"), 100, rep=T))
my.df <- group_by(my.df, sex) %>% mutate(x.sd = as.numeric(scale(x)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.