2017-08-31 8 views
0

に設定するIDという列を持つデータフレームdfがあります。 複数の行に同じIDが設定されている可能性があります。そのIDが以前に何回見られたかを示す列値「オカレンス」を設定します。データフレーム内の行のサブセットの列値をR

for (i in unique(df$ID)) { 
    rows = df[df$ID==i, ] 
    for (idx in 1:nrow(rows)) { 
     rows[idx,'occurrence'] = idx 
    } 
} 

残念ながら、これは行にオカレンス列を追加しますが、元のデータフレームを更新しません。 dfにオカレンス列を追加するにはどうすればよいですか?

更新:neilfwsによって指摘されたrow_number()関数はうまく機能します。実際には、私はフォローアップの質問があります:データフレームにも年の列があります。私がする必要があるのは、IDの前の発生の年に新しい列を追加することです(Prev.Year.For.This.IDなど) 。入力が

Year = c(1991,1991,1993,1994,1995) 
ID = c(1,2,1,2,1) 
df <- data.frame (Year, ID) 

であれば例えば、私は、出力は次のようになりたいのですが:

ID Year occurrence Prev.Year.For.This.Id 
1 1991  1   <NA> 
2 1992  1   <NA> 
1 1993  2   1991 
2 1994  2   1992 
1 1995  3   1993 
+0

これは再現可能にするためにサンプルデータを入力してください。 – www

答えて

3

dplyrgroup_by IDを使用して、row_numberを使用すると、実行中の合計が表示されます。

library(dplyr) 

df1 <- data.frame(ID = c(1,2,3,1,4,5,6,2,7,8,2)) 
df1 %>% 
    group_by(ID) %>% 
    mutate(cnt = row_number()) %>% 
    ungroup() 

     ID cnt 
    <dbl> <int> 
1  1  1 
2  2  1 
3  3  1 
4  1  2 
5  4  1 
6  5  1 
7  6  1 
8  2  2 
9  7  1 
10  8  1 
11  2  3 
+0

ありがとうございます。私は 'row_number()'が何かを知らなかった。 – lebelinoz

+0

私はいつもdplyrでも新しい "もの"を探しています。グループ化が行番号にどのように影響するかを理解するために私はしばらく時間をとったが、それは必ずしも直感的ではない。 – neilfws

+0

ありがとう非常にエレガント! – user1001630

2

あなたは(私はあなたのためのサンプルデータを作った)次のようなものの後にある:

ID occurrence 
1  0 
1  1 
1  2 
2  0 
2  1 
3  0 
library(dplyr) 
df = data.frame(ID = c(1,1,1,2,2,3)) 
answer = df %>% group_by(ID) %>% mutate(occurrence = cumsum(ID/ID) - 1) %>% as.data.frame 

これは、このようなものを与えます

dplyrパッケージは、データのグループ化と集計に最適なツールです。私はまた、パイプを使用するときにコードを非常に読みやすくしています。%>%(確かに、慣れていますが)。

1
> library(data.table) 
> df = data.frame(ID = c(1,1,1,2,2,3)) 
> df <- data.table(df) 
> df[, occurrence := sequence(.N), by = c("ID")] 
> df 
    ID occurrence 
1: 1   1 
2: 1   2 
3: 1   3 
4: 2   1 
5: 2   2 
6: 3   1 
関連する問題