【发布时间】:2015-04-23 06:02:53
【问题描述】:
我有一个喜欢的df
ProjectID Dist
1 x
1 y
2 z
2 x
2 h
3 k
.... ....
我想添加第三列,以便我们为每个 ProjectID 设置一个递增计数器:
ProjectID Dist counter
1 x 1
1 y 2
2 z 1
2 x 2
2 h 3
1 k 3
.... ....
我查看了seq rank 和其他一些内容,特别想看看我是否可以使用ddply 来提供帮助:
df$counter <- ddply(df,.(projectID), function(x).....? )
我想我可以调整这个答案How to create a counter/numeration by group?,但更喜欢使用 ddply 之类的东西(我找不到 cumsum 的等价物,但我认为这里的原理是一样的:Create ascending series of integers by group in Pandas)。这让我可以在列表中索引出现的事件(例如,在此上合并)。
【问题讨论】:
-
您可以尝试
ave即df$counter <- with(df, ave(seq_along(ProjectID), ProjectID, FUN=seq_along))或紧凑的包装器将是library(splitstackshape);getanID(df, 'ProjectID')[]或使用plyr;ddply(df, .(ProjectID), mutate, counter=seq_along(Dist)) -
好吧,这行得通(谢谢!)但我真的不明白它在做什么? (我的头疼)
-
我们按
ProjectID分组,并创建一个新列作为每个组的Dist序列。阅读帮助页面并尝试一些示例后,您会发现它很容易 -
这是
ave的使用我(认为)我发现令人困惑 - 我得到了ddply的例子(它也很有效,再次感谢)但使用ave和 @ 987654339@我正在努力解决问题 -
在
ave中,第二个参数是分组变量,即`ave(x, ..., FUN = mean)`如果你看描述`...:分组变量,通常因子,所有的“长度”都与“x”相同。您也可以使用ave(ProjectID, ProjectID, FUN=seq_along),但是当您有character/factor列时,这将导致错误或获取字符元素作为输出。
标签: r indexing counter plyr seq