2017-04-18 21 views
1

私は次のようなデータを持っていますが、私は累積カウントをしたいのですが、カウント数は同じ年に2回カウントすることはできません。同じ年に因子数と二重計数を計算する方法

mydata<- 
data.table(name=c("hon","hon","hon","acer","acer","acer","acer","acer"), 
year=c(1991,1991,1992,1981,1982,1983,1983,1983), 
count=c(1,1,2,1,2,3,3,3)) 
setDT(mydata) 

私の最初の溶液は

ですが、それは二重の同じ年にカウントされます。 ご意見をお待ちしております。 thx進歩。

+2

mydata [、mycount:= cumsum(!duplicated(year))、by = name] '? –

+0

@docendodiscimus私はOPが 'count'に期待される出力を望んでいるのか分からなかった。とにかく、私は答えを投稿した – akrun

答えて

0

私たちは、「名前」でグループ化した後

mydata[, mycount := match(year, unique(year)), name] 
mydata 
# name year count mycount 
#1: hon 1991  1  1 
#2: hon 1991  1  1 
#3: hon 1992  2  2 
#4: acer 1981  1  1 
#5: acer 1982  2  2 
#6: acer 1983  3  3 
#7: acer 1983  3  3 
#8: acer 1983  3  3 

それとも別のオプションですがmatchを使用することができますfactorlevelsと指定し、 'name'でグループ化して 'year'の要素をuniqueと指定してからinteger

に変換します
mydata[, mycount := as.integer(factor(year, levels = unique(year))), name] 
+0

私はゼロでカウントを開始したい場合は、どのように私はショーを行う。 mydata [、mycount:= mycount-1]は、NA @@を示します。 – changjx

+0

@changjx私は、期待される出力、すなわち 'mydata $ mycountを与えています。 #[1] 0 0私の場合は、mydata [、mycount:=一致(年、一意(年)) - 1、 1 0 1 2 2 2 2 ' – akrun

1

名前ごとに別々の年の累積数が必要なようです。これを行うには、あなたは、年の列にduplicatedを使用し、それを否定し、cumsumことができます。

mydata[, mycount := cumsum(!duplicated(year)), by = name] 

# name year count mycount 
# 1: hon 1991  1  1 
# 2: hon 1991  1  1 
# 3: hon 1992  2  2 
# 4: acer 1981  1  1 
# 5: acer 1982  2  2 
# 6: acer 1983  3  3 
# 7: acer 1983  3  3 
# 8: acer 1983  3  3