亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請問創建多變量計數器

請問創建多變量計數器

小唯快跑啊 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 關注
  • 469 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號