2017-05-24 10 views
0

のユニークな長さにデータフレームに列を追加私の例のDFがある:私はちょうど1からコーラ独特の長さに値とで、colAに基づいて新しいCOLを追加する必要がは1から既存のグループ化された行ここ

df = read.table(text = 'colA 
22 
22 
22 
45 
45 
11 
11 
87 
90 
110 
32 
32', header = TRUE) 

予想される出力:ここ

colA newCol 
    22  1 
    22  1 
    22  1 
    45  2 
    45  2 
    11  3 
    11  3 
    87  4 
    90  5 
    110 6 
    32  7 
    32  7 

が、私は大成功せずにしようとしたものです:

library(dplyr) 
new_df = df %>% 
    group_by(colA) %>% 
    mutate(newCol = seq(1, length(unique(df$colA)), by = 1)) 

おかげ

+0

例のようにコーラの値がクラスタ化されているか、22 45 22のようなシーケンスがある可能性がありますか?あなたは価値に戻ることができますか? – G5W

+0

がクラスタリングされます。ありがとうございました – aaaaa

答えて

1
newcol = c(1, 1+cumsum(diff(df$colA) != 0)) 
[1] 1 1 1 2 2 3 3 4 5 6 7 7 
+0

ありがとう – aaaaa

1

dplyrパッケージは、グループのインデックスを取得する機能を有している。

df$newcol = group_indices(df,colA) 

これが返されます。

colA newcol 
1 22  2 
2 22  2 
3 22  2 
4 45  4 
5 45  4 
6 11  1 
7 11  1 
8 87  5 
9 90  6 
10 110  7 
11 32  3 
12 32  3 

インデックスが出現する順序に従って順序付けされていませんけれども。

また、それはfactorを使用して行うことができます。

df$newcol = as.numeric(factor(df$colA,levels=unique(df$colA))) 
1

別のオプション:あなたは要因が根底にある整数に関連付けられているという事実を生かすことができます。最初に列と同じレベルの新しい係数変数を作成し、それを数値に変換します。

newCol <- factor(df$colA, 
    levels = unique(df$colA)) 

df$newCol <- as.numeric(newCol) 
df 

    colA newCol 
1 22  1 
2 22  1 
3 22  1 
4 45  2 
5 45  2 
6 11  3 
7 11  3 
8 87  4 
9 90  5 
10 110  6 
11 32  7 
12 32  7 
関連する問題