在r中创建基于其他列自动递增的列
我的数据框包含客户ID、产品和日期。我需要创建一个列,在每次customerID或日期更改时生成事务id 我的数据帧当前看起来像:在r中创建基于其他列自动递增的列,r,R,我的数据框包含客户ID、产品和日期。我需要创建一个列,在每次customerID或日期更改时生成事务id 我的数据帧当前看起来像: CustomerID产品--日期 23---------abv--------12-12-14 23-----------------gfs-------12-14 18-------gra-------12-12-14 52-------我们-----14-12-14 23-------qwe------16-12-14 我需要使用r填充transactionID
谢谢你的帮助 假设列
CustomerID
和date
已排序
indx <- as.character(interaction(df[c(1,3)]))
df$transactionID <- cumsum(c(TRUE,indx[-1]!=indx[-length(indx)]))
df$transactionID
#[1] 1 1 2 3 4
或
数据
df根据您对我的评论的回复,您可能还对“data.table”中的.GRP
感兴趣:
库(data.table)
##以防行发生故障
我们还需要了解其他规则吗?“日期”列是否已排序?如果第7行中有CustomerID==23
和date==12-12-14
的情况,这是另一个交易ID还是1?谢谢!customerID==23和date==12-12-14组合不会再次出现在第7行或更高版本中。很好的选择。如果我们知道OP想要什么就更好了:-)+1@AnandaMahto谢谢,我认为无论排序与否,match
或factor
都应该有效。我以前从你那里学过这种索引。但是,这是额外的信息+1:)@jazzurro,也许可以开始合作?我相信你已经知道这一点,但是已经有很多优秀的R作者活跃在这里了;我关心的是内容的重新整理。@AnandaMahto你只是让我意识到一些重要的事情(例如,Gitbook)。我错过了一件大事。我的耻辱。当您创建SOfun
时,许多伟大的R用户都知道人们在这里会问什么。今天早些时候,有一个问题得到了5-6个答案。我在回答中使用了你的getanID
。如果我们能确定一些常见的主题,如子集问题、字符串等,并使用各种软件包编译可能的解决方案,那将是一个很棒的文档。我从您的回答中学到了.GRP
。非常感谢。我想知道[]
到底做什么?我运行了有和没有它的代码,但我看到了相同的结果。这是为什么?@jazzurro,这是我们很久以前通过电子邮件讨论的问题。根据您使用的“data.table”的版本,在使用:=
时可能看不到输出,除非您显式调用[]
(这将打印输出)。请参阅1.9.5版自述文件的第二部分,第2点。啊,没错!我在想什么???再次感谢你。是的,我需要查看结果。
indx1 <- c(indx, indx[1])
as.numeric(factor(indx1, levels=unique(indx1)))
#[1] 1 1 2 3 4 1
match(indx1, unique(indx1))
#[1] 1 1 2 3 4 1
df <- structure(list(CustomerID = c(23L, 23L, 18L, 52L, 23L), Product =
c("abv", "gfs", "gra", "wer", "qwe"), date = c("12-12-14", "12-12-14",
"12-12-14", "14-12-14", "16-12-14")), .Names = c("CustomerID",
"Product", "date"), class = "data.frame", row.names = c(NA, -5L))
library(data.table)
## In case rows get out of order
DT <- as.data.table(df, keep.rownames = TRUE)
DT[, transactionID := .GRP, by = list(CustomerID, date)][]
rn CustomerID Product date transactionID
1: 1 23 abv 12-12-14 1
2: 2 23 gfs 12-12-14 1
3: 3 18 gra 12-12-14 2
4: 4 52 wer 14-12-14 3
5: 5 23 qwe 16-12-14 4