2017-04-18 50 views
1

我有一個數據如下,我想做累計計數的名稱的發生,但計數不能計算兩次在同一年。如何計算因子,並在同一年沒有雙重計數

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

我們可以使用match通過「名」

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 

或者另一種選擇是分組後factorlevels指定爲unique按「姓名」分組後的「年份」的元素,然後將其轉換爲integer

mydata[, mycount := as.integer(factor(year, levels = unique(year))), name] 
+0

問我是否想從零開始計算,我如何表現。 mydata [,mycount:= mycount-1]顯示NA @@? – changjx

+0

@changjx只需要減去1即'mydata [,mycount:= match(year,unique(year)) - 1,name]'對於我來說,它給出了預期的輸出,即'mydata $ mycount #[1] 0 0 1 0 1 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