0

これが初心者の質問である場合は申し訳ありません。データフレームをループする方法について助けが必要です。サンプル データは次のとおりです。

a <- c(10:29);
b <- c(40:59);
e <- rep(1,20);
test <- data.frame(a,b,e)

列「a」の値に対して次の基準を使用して、列「e」を操作する必要があります

のすべての値に対して

"a" <= 15、"e" = 1、

"a" > 15 & < 20、"e" = 2

"a" > 20 & < 25、"e" = 3

"a" > 25 & < 30、"e" = 4 など、次のようになります。

result <- cbind(a,b,rep(1:4, each=5))

私の実際のデータ フレームの長さは 100k を超えています。ここで私を整理していただければ幸いです。

4

3 に答える 3

11
data.frame(a, b, e=(1:4)[cut(a, c(-Inf, 15, 20, 25, 30))])

アップデート:

Greg のコメントは、整数ベクトルを から返された係数でサブセット化する必要なく、より直接的な解決策を提供しますcut

data.frame(a, b, e=findInterval(a, c(-Inf, 15, 20, 25, 30)))
于 2012-08-14T11:11:24.200 に答える
4

私はこれに使用cut()します:

test$e = cut(test$a, 
             breaks = c(0, 15, 20, 25, 30), 
             labels = c(1, 2, 3, 4))

カットを「一般化」したい場合、つまり、作成する必要がある 5 (レベル) のセットの正確な数がわからない場合は、 and を使用して 2 段階のアプローチを取ることができc()ますseq()

test$e = cut(test$a, 
             breaks = c(0, seq(from = 15, to = max(test$a)+5, by = 5)))
levels(test$e) = 1:length(levels(test$e))

Backlin が私を解決に導いたので、ここに別のオプションがあります (このcut()場合は好みませんが、R で利用可能な多くのオプションを示すためだけに投稿しています)。

パッケージrecode()からご利用ください。car

require(car)    
test$e = recode(test$a, "0:15 = 1; 15:20 = 2; 20:25 = 3; 25:30 = 4")
于 2012-08-14T11:15:16.053 に答える
1

ループは必要ありません。必要なものはほぼすべて揃っています。

test[test$a > 15 & test$a < 20, "e"] <- 2
于 2012-08-14T11:09:58.653 に答える