-3

我在R中有一个数据框,格式如下:

Day Agent Event ID
1   Paul  true  1
1   Mary  false 2
1   Mary  false 1
1   Paul  true  3
1   Steve true  1
2   Paul  true  1
2   Paul  false 1
2   Mary  true  1
2   Steve false 1

因此,对于每一天,某人都有一个事件(或没有事件),并且该事件通过 ID 记录为与当天的其他事件相关。ID 每天都会重置,因此第 1 天的 ID 1 与第 2 天的 ID 1 没有关系。我想要一个跨越多天的通用 ID。所以我想添加一列,如:

Day Agent Event ID UniID
1   Paul  true  1  1
1   Mary  false 2  2
1   Mary  false 1  1
1   Paul  true  3  2
1   Steve true  1  1
2   Paul  true  1  3
2   Paul  false 1  3
2   Mary  true  1  3
2   Steve false 1  2

UniID 的目的是,如果我提取给定人员的所有记录,我可以按顺序排列他们的事件,而不必担心这一天。知道该怎么做吗?

更新:感谢到目前为止的反馈。让我再次澄清一下day/ID/UniID。对于每一天,人们要么经历或不经历事件(真/假)。真/假对他们是否获得ID没有影响。当他们有机会参加活动时,他们总会得到一个身份证。因此,在第 1 天,保罗经历了一个事件并获得了 ID 1,然后当天晚些时候他再次经历了该事件并获得了 ID 3,玛丽有两次机会,两次都没有经历,并获得了 ID 1 和 2。ID 表示机会在给定的一天内体验事件。

因为 ID 甚至计数器每天都会重置,所以数据处理会出现。所以在第二天,保罗再次经历了这件事。然而,它也被赋予了 ID 1,但它与第 1 天的事件不同。所以我想给出一个跨越多天的序列顺序。

做一个不同的类比,把经纪人想象成棒球运动员,把比赛想象成一个本垒打的击球机会,把一天想象成一场比赛。所以每个球员都有机会在每一次击球时击出本垒打,我给这些击球手一个该游戏的 ID。现在我想找一个球员,从最旧到最新排序他们的击球机会,并给这个球员一个跨越整个职业生涯的新 ID。

更新 2:

Henrik 的解决方案效果很好。他通过组合 ID、Day、Agent 来创建唯一的字符串因子,然后计算唯一因子并将计数作为新 ID 输出。感谢 Henrik 并很好地了解了 Event 的混淆。下次我问这样的问题时,我会留下这些东西。

4

3 回答 3

1

假设dat是您的原始 data.frame,请尝试以下操作

  library(data.table)
  DT <- data.table(dat)

  DT[, uniID := seq(.N), by=list(Agent, Event)]
  DT

  #     Day Agent Event ID uniID
  #  1:   1  Paul  true  1     1
  #  2:   1  Mary false  2     1
  #  3:   1  Mary false  1     2
  #  4:   1  Paul  true  3     2
  #  5:   1 Steve  true  1     1
  #  6:   2  Paul  true  1     3
  #  7:   2  Paul false  1     1
  #  8:   2  Mary  true  1     1
  #  9:   2 Steve false  1     1

目前还不是很清楚你是如何确定“唯一性” 的,但是无论你使用什么标准,把它放在列表中by=,你应该被设置。

于 2013-08-02T18:46:07.370 回答
1

不是很漂亮,但似乎有效:

library(plyr)
dd <- read.table(text = "Day Agent Event ID
1   Paul  true  1
1   Mary  false 2
1   Mary  false 1
1   Paul  true  3
1   Steve true  1
2   Paul  true  1
2   Paul  false 1
2   Mary  true  1
2   Steve false 1", header = TRUE)

dd$ID2 <- with(dd, paste0(Day, Agent, ID))

# for each agent, create a numeric version of its ID2    
dd <- ddply(.data = dd, .variables = .(Agent), mutate, UniID = as.numeric(as.factor(ID2)))

# some clean-up
dd2 <- subset(dd, select = -ID2)
arrange(dd2, Agent, Day, UniID)

PS:也许我误解了一些东西,但至少对我来说,Event你的虚拟数据中的变量导致更多的混乱而不是帮助解决问题。

于 2013-08-02T19:31:51.807 回答
0

ID必须是数字吗?它必须是结果的还是只是增加的?无论哪种方式,您似乎都想要一个有序的序列。因此,首先以您想要的方式对数据进行排序,然后为每一行添加一个 id。

library(data.table)

dd <- read.table(text = "Day Agent Event ID
1   Paul  true  1
1   Mary  false 2
1   Mary  false 1
1   Paul  true  3
1   Steve true  1
2   Paul  true  1
2   Paul  false 1
2   Mary  true  1
2   Steve false 1", header = TRUE)

dd <- dd[order(dd$Day,dd$Agent,dd$ID),]
dd$uniID <- seq(1:nrow(dd))

dd
  Day Agent Event ID uniID
3   1  Mary false  1     1
2   1  Mary false  2     2
1   1  Paul  true  1     3
4   1  Paul  true  3     4
5   1 Steve  true  1     5
8   2  Mary  true  1     6
6   2  Paul  true  1     7
7   2  Paul false  1     8
9   2 Steve false  1     9
于 2013-08-02T22:03:08.310 回答