2016-08-09 3 views
0

サブグループ内のRのデータ列の標準化には苦労しています。サブグループ内のRのデータ列を標準化

私は、データフレームを作成しました:

df<-data.frame(
salesPerson=sample(c('Alan','Bob','Cindy'),20 ,replace=TRUE) 
, quater=sample(c('Q1','Q2','Q3'),20 ,replace=TRUE) 
,salesValue=runif(20, 5.0, 7.5) 
) 

私は販売のスケーリングされた値を持つデータフレームに追加の列を追加したいと思います。

df$salesValueScaled<-scale(df$salesValue) 

問題は、私がコラム販売員とQUATERの組み合わせごとに分離可能に売上を拡大したいということです。

は、私は、コードを使用することができ、すべての列をスケーリングします。 Sthのように:

私はこのフォーラムでこのソリューションを探していましたが、この問題の解決策を見つけることができませんでした。

ありがとうございました。

+5

'ライブラリ(dplyr); df%>%group_by(salesPerson、quater)%>%mutate(scaled_Col = scale(salesValue)) '? – Abdou

+0

@michalk 'dplyr'や' data.table'のチュートリアルを参照してください。どちらのパッケージもこの種のことをうまくやっています。 – steveb

+0

@Abdou:ほぼ理想的ですが、サブセットに1つしか観測されていない場合はNaを取得します。 – michalk

答えて

1

あなたはこのためdplyr使用することができます:NA sを返します行を回避するには

library(dplyr) 

new_df <- df %>% group_by(salesPerson, quater) %>% 
    mutate(scaled_Col = scale(salesValue)) %>% 
    ungroup 

を、あなたは彼らがそうであるように元の値を維持するか、スケーリング前にそれらを除外することができ、次のいずれか

維持元の値(NROWが1より大きいスケーリングインスタンスのみを保持することによって)

new_df <- df %>% group_by(salesPerson, quater) %>% 
    mutate(scaled_Col = ifelse(NROW(salesValue) > 1, scale(salesValue), salesValue)) %>% 
    ungroup 

それらをフィルタリング(@stevebの提案通り):

new_df <- df %>% group_by(salesPerson, quater) %>% 
    filter(n() > 1) %>% 
    mutate(scaled_Col = scale(salesValue)) %>% 
    ungroup 

私はこれが役立つことを望みます。

関連する問題