63

連続変数を 3 つの等しいサイズのグループに分割/分割する必要があります。

データ フレームの例:

das <- data.frame(anim = 1:15,
                  wt = c(181,179,180.5,201,201.5,245,246.4,
                         189.3,301,354,369,205,199,394,231.3))

( の値に応じて) 切り取った後、次のようwtに新しい変数の下に 3 つのクラスを配置する必要があります。wt2

> das 
   anim    wt wt2
1     1 181.0   1
2     2 179.0   1
3     3 180.5   1
4     4 201.0   2
5     5 201.5   2
6     6 245.0   2
7     7 246.4   3
8     8 189.3   1
9     9 301.0   3
10   10 354.0   3
11   11 369.0   3
12   12 205.0   2
13   13 199.0   1
14   14 394.0   3
15   15 231.3   2

これは、大規模なデータ セットに適用されます。

4

11 に答える 11

67

これを試して:

split(das, cut(das$anim, 3))

の値に基づいて分割する場合はwt

library(Hmisc) # cut2
split(das, cut2(das$wt, g=3))

cutとにかく、cut2とを組み合わせることでそれを行うことができますsplit

更新しました

グループ インデックスを追加の列として使用する場合は、

das$group <- cut(das$anim, 3)

列が 1、2、... のようなインデックスである必要がある場合、

das$group <- as.numeric(cut(das$anim, 3))

再度更新

これを試して:

> das$wt2 <- as.numeric(cut2(das$wt, g=3))
> das
   anim    wt wt2
1     1 181.0   1
2     2 179.0   1
3     3 180.5   1
4     4 201.0   2
5     5 201.5   2
6     6 245.0   2
7     7 246.4   3
8     8 189.3   1
9     9 301.0   3
10   10 354.0   3
11   11 369.0   3
12   12 205.0   2
13   13 199.0   1
14   14 394.0   3
15   15 231.3   2
于 2011-05-24T01:31:14.670 に答える
61

またはcut_numberggplot2パッケージから参照してください。

das$wt_2 <- as.numeric(cut_number(das$wt,3))

cut(...,3)元のデータの範囲を同じ長さの 3 つの範囲に分割することに注意してください。データが不均一に分布している場合、必ずしもグループごとに同じ数の観測cut_numberが行われるとは限りません (適切に使用することで再現できますがquantile、便利な便利な関数です)。一方、引数Hmisc::cut2()を使用すると分位数で分割されるため、 とほぼ同等です。のようなものがこれまでに浸透したと思っていたかもしれませんが、私が知る限り、そうではありませんg=ggplot2::cut_numbercut_numberdplyr

于 2011-11-01T11:41:05.613 に答える
8

cut2使用しない代替。

das$wt2 <- as.factor( as.numeric( cut(das$wt,3)))

また

das$wt2 <- as.factor( cut(das$wt,3, labels=F))

@ ben-bolkerが指摘しているように、これは占有ではなく等しい幅に分割されます。quantiles1つを使用すると、ほぼ同じ占有率になると思います

x = rnorm(10)
x
 [1] -0.1074316  0.6690681 -1.7168853  0.5144931  1.6460280  0.7014368
 [7]  1.1170587 -0.8503069  0.4462932 -0.1089427
bin = 3 #for 1/3 rd, 4 for 1/4, 100 for 1/100th etc
xx = cut(x, quantile(x, breaks=1/bin*c(1:bin)), labels=F, include.lowest=T)
table(xx)
1 2 3 4
3 2 2 3
于 2011-10-05T10:27:05.597 に答える
7

ntileこれからdplyrはこれを行いますが、 で奇妙な動作をしNAます。

cut2ベースRで機能し、上記のソリューションと同等のことを行う次の関数で同様のコードを使用しました。

ntile_ <- function(x, n) {
    b <- x[!is.na(x)]
    q <- floor((n * (rank(b, ties.method = "first") - 1)/length(b)) + 1)
    d <- rep(NA, length(x))
    d[!is.na(x)] <- q
    return(d)
}
于 2016-10-15T01:22:57.917 に答える