说我有以下data.table:
library(data.table)
DT <- data.table(R=sample(0:1, 10000, rep=TRUE), Seq=0)
Run Code Online (Sandbox Code Playgroud)
返回的内容如下:
R Seq
1: 1 0
2: 1 0
3: 0 0
4: 0 0
5: 1 0
---
9996: 1 0
9997: 0 0
9998: 0 0
9999: 0 0
10000: 1 0
Run Code Online (Sandbox Code Playgroud)
我想生成一个序列(1,2,3,...,n),只要R从前一行改变,它就会重置.想想它就像我在计算一连串随机数.
那么上面会是这样的:
R Seq
1: 1 1
2: 1 2
3: 0 1
4: 0 2
5: 1 1
---
9996: 1 5
9997: 0 1
9998: 0 2
9999: 0 3
10000: 1 2
Run Code Online (Sandbox Code Playgroud)
思考?
显然我做得不对.这种方法有效,但很难实用.请记住,我正在使用的示例数据运行得很快,但如果您要在400k行+的DT上尝试此操作,那么您将等待一段时间.
我最初这样做是因为我可以将日期转换为财政周(周五到周四)的名字.我希望能够查看DT中的每个日期,测试它落入哪个范围,然后返回周名称.它就像一个魅力!但是,就像我说的那样,非常缓慢.
然后我认为这对于我可能需要做的任何逐行调整都是一种很好的技术,但除非我能以某种方式对其进行优化,否则我可能需要重新考虑事情......
因此,让我们使用mtcars数据集,假设我们想要查看每行中的cyl,然后将该数字转换为它的单词.
cyl.word <- function(c) {
r <- "Huh?"
if(c==4) {r <- "Four"}
if(c==6) {r <- "Six"}
if(c==8) {r <- "Eight"}
return(r)
}
Run Code Online (Sandbox Code Playgroud)
像你期望的那样工作,如果你键入cyl.word(4)你得到"四".大.让我们在DT上应用它......
cars <- data.table(mtcars)
cars[, Word:=cyl.word(cars$cyl[.I]), by=cyl]
head(cars)
mpg cyl disp hp drat wt qsec vs am gear carb Word
1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Six
2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Six
3: 22.8 4 108 93 3.85 2.320 …Run Code Online (Sandbox Code Playgroud)