1

Rは初めてですが、列のデータに基づいてグループ列を導入しようとしています。

data.frameの例

1           11.3178501            4    9        11.618880
2           10.3969713           20    8        11.047486
8            9.5067421           14    7        10.079806
6            6.6135932            6    6         7.002669
4            5.4157174            2    5         5.566232
17           3.8860793            5    4         4.235564
16           3.8183699           15    3         4.406416
11           1.2574765           18    2         1.885113
15           0.7084411            7    1         1.130990

最初の列はRによって導入されたインデックスですが、順序が異なるように並べ替えました。私がやろうとしているのは、最後の列の値に基づいて各行が属するブラケットを定義する列を導入することです。したがって、最後の列の値が0-5 => 1, 5-0 => 2etcの間にある場合は、最後に新しい列を追加しますgroup -> 1,2,3...

16           3.8183699           15    3         4.406416    1
11           1.2574765           18    2         1.885113    2
15           0.7084411            7    1         1.130990    2

次のことを試しましたdataFrame$column4 < 5が、ブール値が得られたので、これに1を掛けると、次のようになります。

0 0 0 0 0 1 1 1 1

正しい方向に進んでいるかどうかはわかりません。

4

2 に答える 2

5

あなたのコメントがあったとしても、私はまだ提案しcutます。これはベースRにあり、通常は派手な関数とは見なされません。

df <- structure(list(V1 = c(1L, 2L, 8L, 6L, 4L, 17L, 16L, 11L, 15L), 
    V2 = c(11.3178501, 10.3969713, 9.5067421, 6.6135932, 5.4157174, 
    3.8860793, 3.8183699, 1.2574765, 0.7084411), V3 = c(4L, 20L, 
    14L, 6L, 2L, 5L, 15L, 18L, 7L), V4 = c(9L, 8L, 7L, 6L, 5L, 
    4L, 3L, 2L, 1L), V5 = c(11.61888, 11.047486, 10.079806, 7.002669, 
    5.566232, 4.235564, 4.406416, 1.885113, 1.13099)), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-9L))

df$groups <- cut(df$V5, seq(0,15, by=5))

> df
  V1         V2 V3 V4        V5  groups
1  1 11.3178501  4  9 11.618880 (10,15]
2  2 10.3969713 20  8 11.047486 (10,15]
3  8  9.5067421 14  7 10.079806 (10,15]
4  6  6.6135932  6  6  7.002669  (5,10]
5  4  5.4157174  2  5  5.566232  (5,10]
6 17  3.8860793  5  4  4.235564   (0,5]
7 16  3.8183699 15  3  4.406416   (0,5]
8 11  1.2574765 18  2  1.885113   (0,5]
9 15  0.7084411  7  1  1.130990   (0,5]
> 

最後に、整数が必要な場合は、groupsを使用して整数に強制変換できますfactor

df$groups <- as.integer(df$groups)

> as.integer(df$groups)
[1] 3 3 3 2 2 1 1 1 1
于 2012-06-20T18:51:59.120 に答える
1

ジャスティンの答えは素晴らしいです。ただし、ダンバーカットを自分で実装する場合は、この方法で実行できます。最初に、のようなしきい値を使用してベクトルを定義しthre<-c(0,5,10,15)、次に、より大きい演算子を使用して値とそれらのしきい値の外部比較を行い、次のように作成されたマトリックスの行を合計します。

rowSums(outer(values,thre,'>'))

そして出来上がり、(0,5]のすべての値は1になり、(5,10]は2になります。
関数にラップされると、次のようになります。

ultraDumbCut<-function(v,thre) rowSums(outer(v,thre,'>'))

次のように、もう少しインテリジェントになりました。

dumbCut<-function(v,jump=5,thre=seq(0,max(v),by=jump)) rowSums(outer(v,thre,'>'))

つまり、dumbCut(1:7)is 1 1 1 1 1 2 2dumbCut(1:7,3)is 1 1 1 2 2 2 3dumbCut(1:7,thre=c(0,2,3,5))isです1 1 2 3 3 4 4

次のステップは、出力を係数に変換し(Rのカテゴリに数値を使用することは単なるマゾヒズムであるため)、意味のあるレベル名を生成することです。これにより、基本的に実際のを複製しcutます。

于 2012-06-20T22:15:47.897 に答える