为了账号安全,请及时绑定邮箱和手机立即绑定

请问创建多变量计数器

请问创建多变量计数器

小唯快跑啊 2019-07-29 13:00:53
创建多变量计数器我的数据如下:CustomerID TripDate1           1/3/20131           1/4/20131           1/9/20132           2/1/20132           2/4/20133           1/2/2013我需要创建一个计数器变量,如下所示:CustomerID TripDate   TripCounter1           1/3/2013   11           1/4/2013   2 1           1/9/2013   32           2/1/2013   12           2/4/2013   2 3           1/2/2013   1 Tripcounter对每一位顾客都是如此。
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

使用ave..假设你data.frame名为“mydf”:


mydf$counter <- with(mydf, ave(CustomerID, CustomerID, FUN = seq_along))

mydf

#   CustomerID TripDate counter

# 1          1 1/3/2013       1

# 2          1 1/4/2013       2

# 3          1 1/9/2013       3

# 4          2 2/1/2013       1

# 5          2 2/4/2013       2

# 6          3 1/2/2013       1

为了说明它的价值,我还在我的“splitstackform”包中包含的函数中实现了该方法的一个版本。这个函数被调用getanID:


mydf <- data.frame(IDA = c("a", "a", "a", "b", "b", "b", "b"),

                   IDB = c(1, 2, 1, 1, 2, 2, 2), values = 1:7)

mydf

# install.packages("splitstackshape")

library(splitstackshape)

# getanID(mydf, id.vars = c("IDA", "IDB"))

getanID(mydf, id.vars = 1:2)

#   IDA IDB values .id

# 1   a   1      1   1

# 2   a   2      2   1

# 3   a   1      3   2

# 4   b   1      4   1

# 5   b   2      5   1

# 6   b   2      6   2

# 7   b   2      7   3

从上面的示例中可以看到,我编写函数的方式是可以指定一个或多个列作为ID列。它检查是否有任何id.vars被复制,如果是,那么它将为您生成一个新的ID变量。




查看完整回答
反对 回复 2019-08-02
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

您也可以使用plyr为此(使用@AnadaMahto的示例数据):


> ddply(mydf, .(IDA), transform, .id = seq_along(IDA))

  IDA IDB values .id

1   a   1      1   1

2   a   2      2   2

3   a   1      3   3

4   b   1      4   1

5   b   2      5   2

6   b   2      6   3

7   b   2      7   4

甚至:


> ddply(mydf, .(IDA, IDB), transform, .id = seq_along(IDA))

  IDA IDB values .id

1   a   1      1   1

2   a   1      3   2

3   a   2      2   1

4   b   1      4   1

5   b   2      5   1

6   b   2      6   2

7   b   2      7   3

请注意plyr没有最快的解决方案的美誉,因为你需要看一看data.table.


这是一个data.table方法:


library(data.table)

DT <- data.table(mydf)

DT[, .id := sequence(.N), by = "IDA,IDB"]

DT

#    IDA IDB values .id

# 1:   a   1      1   1

# 2:   a   2      2   1

# 3:   a   1      3   2

# 4:   b   1      4   1

# 5:   b   2      5   1

# 6:   b   2      6   2

# 7:   b   2      7   3




查看完整回答
反对 回复 2019-08-02
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

我需要经常这样做,并编写了一个函数,它的实现与以前的答案不同。我不知道哪一种解决办法最有效。

idCounter <- function(x)  {
    unlist(lapply(rle(x)$lengths, seq_len))}mydf$TripCounter <- idCounter(mydf$CustomerID)


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 403 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信