3

Sepal.Lengthの値を種ごとに正規化するにはどうすればよいですか?

    iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
...

# i have to divide by 
tapply(iris$Sepal.Length, iris$Species, max)
    setosa versicolor  virginica 
       5.8        7.0        7.9 

言い換えると、すべての値Species=="setosa"を5.8で除算したいので、最後に、Sepal.Length列に正規化された値0..1のデータフレームが必要です。

最後にそれは戻るはずです

    iris
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1      0.8793103         3.5          1.4         0.2     setosa
...
4

4 に答える 4

7

明らかに、これを行う方法はたくさんあります。私はave()(DWinの答えを参照)の構文またはdata.tableパッケージが一番好きです:

library(data.table)
dt <- data.table(iris)
dt[, Sepal.Length:=(Sepal.Length)/max(Sepal.Length), by="Species"]
dt
#      Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#   1:    0.8793103         3.5          1.4         0.2    setosa
#   2:    0.8448276         3.0          1.4         0.2    setosa
#   3:    0.8103448         3.2          1.3         0.2    setosa
#   4:    0.7931034         3.1          1.5         0.2    setosa
#   5:    0.8620690         3.6          1.4         0.2    setosa
# 146:    0.8481013         3.0          5.2         2.3 virginica
# 147:    0.7974684         2.5          5.0         1.9 virginica
# 149:    0.7848101         3.4          5.4         2.3 virginica
# 150:    0.7468354         3.0          5.1         1.8 virginica

df <- data.frame(dt) ## It's possible (but not necessary) to coerce back to
                     ## a plain old data.frame
于 2012-10-25T20:19:01.817 に答える
5

私はあなたの願望を最大値で割るということを厳密に解釈しています。

1つのオプション:

aggregate(iris$Sepal.Length,list(iris$Species),FUN = function(x) x/max(x))

もう1つは、ddplyfrom plyrを使用します(すべての列を一度にスケーリングします。

ddply(iris,.(Species),colwise(function(x){x / max(x)}))

また、@ Dwinのave例に似たバリアントで、他の列を同じに保ちますが、次を使用しddplyます。

ddply(iris,.(Species),transform,Sepal.Length = Sepal.Length / max(Sepal.Length))
于 2012-10-25T20:20:20.227 に答える
3
  iris$ratio_to_max <- ave( iris$Sepal.Length, list(iris$Species), 
                                                     FUN= function(x) x/max(x))
#-------------
> str(iris)
'data.frame':   150 obs. of  6 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ ratio_to_max: num  0.879 0.845 0.81 0.793 0.862 ...

カラムを交換したい場合Sepal.Lengthはそうすることができますが、私は通常、私が望むものを手に入れたことを本当に確信するまで、そのような破壊的な慣行を避けます。(それでも私は罪悪感を感じます。)これを別のリスト「パケット」に入れて、元の「Sepal.Length」列を破棄したい場合は、次を使用できますsplit

 spl.iris <- split(iris[-1], iris$Species)
 str(spl.iris)
于 2012-10-25T20:27:08.227 に答える
0

私は、より良いplyrまたはdata table、あるいは基本的な方法があると確信しています。

L1 <- lapply(split(iris[, -5], iris$Species), function(x) apply(x, 2, scale))
L2 <- lapply(seq_along(L1), function(i) {
    data.frame(SPecies=names(L1)[i], L1[[i]])
})
do.call(rbind, L2)
于 2012-10-25T20:15:26.507 に答える