如何基于列值为Agent消息添加增量计数(R语言)
按会话分组统计坐席消息递增计数
问题背景
我有这样一个包含会话记录的DataFrame:
sample_df <- structure(list(conversationid = c("C1", "C2", "C2", "C2", "C2", "C2", "C3", "C3", "C3", "C3"), sentby = c("Consumer","Consumer", "Agent", "Agent", "Agent", "Consumer", "Agent", "Consumer","Agent", "Agent"), time = c("2018-04-25 03:54:04.550+0000", "2018-05-11 19:18:05.094+0000", "2018-05-11 19:18:09.218+0000", "2018-05-11 19:18:09.467+0000", "2018-05-11 19:18:13.527+0000", "2018-05-14 22:57:10.004+0000", "2018-05-14 22:57:14.330+0000", "2018-05-14 22:57:20.795+0000", "2018-05-14 22:57:22.168+0000", "2018-05-14 22:57:24.203+0000"), diff = c(NA, NA, 0.0687333333333333, 0.00415, 0.0676666666666667, NA, 0.0721, 0.10775, 0.0228833333333333,0.0339166666666667)), .Names = c("conversationid", "sentby","time","diff"), row.names = c(NA, 10L), class = "data.frame")
其中conversationid是会话ID,每条消息由Agent(坐席)或Consumer(消费者)发送。我需要按conversationid分组,对sentby为"Agent"的消息维护递增计数,非Agent消息计数为0,目标输出如下:
conversationid sentby diff agent_counter_flag C1 Consumer NA 0 C2 Consumer NA 0 C2 Agent 0.06873333 1 C2 Agent 0.00415 2 C2 Agent 0.06766667 3 C2 Consumer NA 0 C3 Agent 0.0721 1 C3 Consumer 0.10775 0 C3 Agent 0.02288333 2 C3 Agent 0.03391667 3
当前尝试的问题
我目前用这段代码按会话分组对所有记录按时间排名:
setDT(sample_df) sample_df[,Order := rank(time, ties.method = "first"), by = "conversationid"] sample_df <- as.data.frame(sample_df)
但这段代码会对分组内所有记录排名,没有区分Agent和Consumer,当前输出是:
conversationid sentby diff Order C1 Consumer NA 1 C2 Consumer NA 1 C2 Agent 0.06873333 2 C2 Agent 0.00415 3 C2 Agent 0.06766667 4 C2 Consumer NA 5 C3 Agent 0.0721 1 C3 Consumer 0.10775 2 C3 Agent 0.02288333 3 C3 Agent 0.03391667 4
请问怎么修改代码才能得到目标输出?
解决方案
你可以利用data.table的分组功能,结合cumsum()函数来实现这个需求——只对sentby == "Agent"的行累加计数,其他行保持0。具体代码如下:
library(data.table) setDT(sample_df) # 按conversationid分组,生成agent_counter_flag sample_df[, agent_counter_flag := ifelse(sentby == "Agent", cumsum(sentby == "Agent"), 0), by = conversationid] # 转换回data.frame(如果需要的话) sample_df <- as.data.frame(sample_df)
代码解释
by = conversationid:确保我们是在每个会话内部单独计数sentby == "Agent":生成一个逻辑向量,Agent行是TRUE(等价于1),非Agent行是FALSE(等价于0)cumsum(sentby == "Agent"):对这个逻辑向量做累加,这样每个会话内的Agent行就会按顺序得到1、2、3...的递增计数ifelse(...):把非Agent行的计数替换为0,正好符合你的需求
运行这段代码后,你就能得到和目标输出完全一致的结果啦。
内容的提问来源于stack exchange,提问作者user2092493
相关产品推荐
相关产品推荐

