我有麻烦找出如何总结排在data.table
而省略的过程中某一组的值。
比方说,我有一个data.table
以下形式:
library(data.table)
dt <- data.table(year = c(2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003),
name = c("Tom", "Tom", "Tom", "Tom", "Fred", "Fred", "Fred", "Fred", "Gill", "Gill", "Gill", "Gill", "Ann", "Ann", "Ann", "Ann"),
g1 = c(1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1),
g2 = c(1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1),
g3 = c(1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1),
g4 = c(0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1))
setkey(dt, name, year)
其中g1
- g4
是游戏中的玩家指示变量name
参加了一次year
。
我想要做的是计算球员每场比赛的数量NPg1
- NPg4
,其中两个选手参加了焦点比赛,但前提是他们还互相在另一场比赛在同一年发挥,这总和应排除对他们来说,正在计算它的球员。
我亲近使用此代码修改如何在R中一个载体会逐渐增加值例如,对于NPg1
:
dtg1 <- dt[,.SD[(g1==1) & (g2==1 | g3==1 | g4==1)][, NPg1:= sum(g1)], by=year]
该子集dt
我的条件和创建总和,但是,和包括焦点球员。 例如NPg1
在year==2000
是1汤,但它应该是0,因为尽管他在出场g1
他没有在那年另一场比赛发挥其他玩家。 一旦我得到的和正确的,然后我就可以做到这一点的每场比赛,结果合并回一个data.table
。 主要的问题是,怎样才能得到这些条件正确的总和。
对于结果NPg1
应该是这样的
dtg1$NPg1result <- c(0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3)
任何想法将不胜感激。
@ Mike.Gahan的评论后:
这是子结果为g1
,也许这不会成为很清楚的形式我的职务。 一旦我有一个正确的,我可以很容易地加入它回满data.table
使用:
library(plyr)
dt <- join(dt, dtg1)
或其他合并/ join操作,但由于我的问题是关注的主要子结果,我不想打扰大家一起休息。
编辑后@里卡多Saportas解决方案
所有的游戏的完整期望的结果如下所示:
dtresult <- data.table(year = c(2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003, 2000, 2001, 2002, 2003),
name = c("Ann", "Ann", "Ann", "Ann", "Fred", "Fred", "Fred", "Fred", "Gill", "Gill", "Gill", "Gill", "Tom", "Tom", "Tom", "Tom"),
NPg1 = c(0, 1, 3, 3, 0, 0, 3, 3, 0, 0, 3, 3, 0, 1, 3, 3),
NPg2 = c(0, 0, 2, 3, 0, 0, 2, 3, 1, 0, 0, 3, 1, 0, 2, 3),
NPg3 = c(0, 0, 3, 2, 0, 2, 3, 0, 1, 2, 3, 2, 1, 2, 3, 2),
NPg4 = c(0, 0, 2, 2, 0, 1, 0, 0, 0, 1, 2, 2, 0, 0, 2, 2))