0

Here is the data.

set.seed(23) data<-data.frame(ID=rep(1:12), group=rep(1:3,times=4), value=(rnorm(12,mean=0.5, sd=0.3)))

   ID group     value
1   1     1 0.4133934
2   2     2 0.6444651
3   3     3 0.1350871
4   4     1 0.5924411
5   5     2 0.3439465
6   6     3 0.3673059
7   7     1 0.3202062
8   8     2 0.8883733
9   9     3 0.7506174
10 10     1 0.3301955
11 11     2 0.7365258
12 12     3 0.1502212

I want to get z-standardized scores within each group. so I try

library(weights)
data_split<-split(data, data$group) #split the dataframe
stan<-lapply(data_split, function(x) stdz(x$value)) #compute z-scores within group

However, It looks wrong because I want to add a new variable following 'value' How can I do that? Kindly provide some suggestions(sample code). Any help is greatly appreciated .

4

4 に答える 4

1

Ferdinand.Kraft のソリューションを試しましたが、うまくいきませんでした。stdzこの機能は、基本的な R インストールには含まれていないと思います。さらに、このwithin部分は、多くの変数を含む大規模なデータセットで私を悩ませました。最も簡単な方法は次のとおりだと思います。

data$value.s <- ave(data$value, data$group, FUN=scale)
于 2013-09-23T08:28:26.433 に答える
1

代わりにこれを使用してください:

within(data, stan <- ave(value, group, FUN=stdz))

splitnorを呼び出す必要はありませんlapply

于 2013-09-15T02:01:55.717 に答える
0

関数内で新しい列を追加し、関数がデータ フレーム全体を返すようにします。

stanL<-lapply(data_split, function(x) {
x$stan <- stdz(x$value)
x
})

stan <- do.call(rbind, stanL)
于 2013-09-15T02:04:16.663 に答える