1

A、B、C などのいくつかのグループがあり、cutこれらのグループに基づいて別の変数が必要です。つまり、各グループには同じ変数に対して特定のブレークがあります。

グループの平均を計算する必要がある場合は、次のtapplyように使用します。

tapply(mydata$var,mydata$group,mean)

cut残念ながら、異なるグループの break=c(...) 引数を変更してこれを修正する方法がわかりません。

tapply(mydata$var,mydata$group,cut)

助言がありますか?私はそれをやりたいのですtapplyが、カスタムメイドの機能以外の他のソリューションも適しています。

編集:いくつかの小さな例:

test <- data.frame(var=rnorm(100,0,1),
               group=c(rep("A",30),
                       rep("B",20),
                       rep("C",50)))
# for group A:
cut(test$var,breaks=c(-4,0,4))
# for group B
cut(test$var,breaks=c(-4,1,4))

等々...

4

2 に答える 2

2

ここに読心術の帽子をかぶって、次のようなものが欲しいと突き刺します。

dat <- data.frame(x = runif(100),grp = rep(letters[1:3],length.out = 100))

mapply(cut,split(dat$x,dat$grp),list(c(-Inf,0.5,Inf),
                                     c(-Inf,0.1,0.5,0.9,Inf),
                                     c(-Inf,0.25,0.5,0.75,Inf)))

したがって、これは単純に分割xして、各ピースに異なるブレークを使用して各ピースgrpに適用するだけです。cut

于 2011-12-23T15:28:34.127 に答える
1

実際、R はここで非常に賢い振る舞いをします。最初に考えた方法で機能する解決策を見つけました。apply家族を使っていないのに。どういうわけか、R は因数ではなくここで整数を作成します。そのため、このソリューションでは、Joran が言及したような因数レベルに問題はありません。

dat <- data.frame(x = rnorm(100),grp = rep(letters[1:3],length.out = 100))
ifelse(dat$grp == "a",cut(dat$x,breaks=c(-Inf,0.1,0.2,Inf)),
       ifelse(dat$grp == "b",cut(dat$x,breaks=c(-Inf,0.1,1,Inf)),
              cut(dat$x,breaks=c(-Inf,0.9,2,Inf))) )
于 2011-12-23T16:07:42.093 に答える