2015-10-06 16 views
-1

我有一个很大的data.frame,我想要生成一个新的列(称为Seq),它有一个连续的值,每次在不同列中发生更改时都会重新启动。以下是data.frame(省略列)和新列Seq的示例。正如你所看到的,有一个顺序计数,但是每次有一个新的IDPath时,顺序计数就会重新开始。 的sequentiel长度可以有不同的长度,有些是长音,有的则是300带条件的数字序列

IDPath LogTime    Seq 
AADS  19-06-2015 01:57  1 
AADS  19-06-2015 01:55  2 
AADS  19-06-2015 01:54  3 
AADS  19-06-2015 01:53  4 
DHSD  19-06-2015 12:57  1 
DHSD  19-06-2015 10:58  2 
DHSD  19-06-2015 09:08  3 
DHSD  19-06-2015 08:41  4 
+1

这些都是伟大的答案!谢谢您的帮助!他们都解决了我的问题,谢谢! – KhalidN

+0

很酷。您应该选择一个并接受它作为答案(如果您使用的是data.table,则可以是Japp或CathG)。 – hrbrmstr

+3

或者你们首先需要开始关闭这种骗局。 –

回答

3

强制性Hadleyverse答案(基础R答案也包括Hadleyvese答案后):

library(dplyr) 

dat <- read.table(text="IDPath LogTime 
AADS  '19-06-2015 01:57'  
AADS  '19-06-2015 01:55'  
AADS  '19-06-2015 01:54'  
AADS  '19-06-2015 01:53'  
DHSD  '19-06-2015 12:57'  
DHSD  '19-06-2015 10:58'  
DHSD  '19-06-2015 09:08'  
DHSD  '19-06-2015 08:41'  ", header=TRUE, stringsAsFactors=FALSE, quote="'") 

mutate(group_by(dat, IDPath), Seq=1:n()) 

OR(经由大卫Arenburg)

mutate(group_by(dat, IDPath), Seq=row_number()) 

或者,如果你到管道:

dat %>% 
    group_by(IDPath) %>% 
    mutate(Seq=1:n()) 

OR(通过大卫Arenburg)

dat %>% 
    group_by(IDPath) %>% 
    mutate(Seq=row_number()) 

强制性基础R回答:

unsplit(lapply(split(dat, dat$IDPath), transform, Seq=1:length(IDPath)), dat$IDPath) 

以上惯用(再次通过大卫)

with(dat, ave(IDPath, IDPath, FUN = seq_along)) 

如果它确实是一个巨大的数据帧,那么你可能要开始tbl_dt(dat)dplyr解决方案,但CathG的,或者如果您已经在使用data.table夏侯的版本会更快。

+0

或'row_number()' –

+0

thx快一点。添加(与基础R解决方案一起) – hrbrmstr

+0

我认为这个idimatic base会像'with(dat,ave(IDPath,IDPath,FUN = seq_along))' –

5

使用data.table包,这里是一个方式来获得你想要的东西:

require(data.table) 
setDT(dt)[, Seq:=1:.N, by=IDPath] 
# or, as mentioned by @DavidArenburg 
setDT(dt)[, Seq:=seq_len(.N), by=IDPath] 

dt 
# IDPath   LogTime Seq 
#1: AADS 19-06-2015 01:57 1 
#2: AADS 19-06-2015 01:55 2 
#3: AADS 19-06-2015 01:54 3 
#4: AADS 19-06-2015 01:53 4 
#5: DHSD 19-06-2015 12:57 1 
#6: DHSD 19-06-2015 10:58 2 
#7: DHSD 19-06-2015 09:08 3 
#8: DHSD 19-06-2015 08:41 4 
+1

'seq_len(.N)'可能会比':' –

4

也可以使用rleid函数从data.table包,它是专为在分组操作产生游程长度类型id列设计:

library(data.table) 
setDT(df)[, Seq:=rleid(LogTime), by=IDPath] 

结果:

> df 
    IDPath   LogTime Seq 
1: AADS 19-06-2015:01:57 1 
2: AADS 19-06-2015:01:55 2 
3: AADS 19-06-2015:01:54 3 
4: AADS 19-06-2015:01:53 4 
5: DHSD 19-06-2015:12:57 1 
6: DHSD 19-06-2015:10:58 2 
7: DHSD 19-06-2015:09:08 3 
8: DHSD 19-06-2015:08:41 4 

另一个选项将使用the current development version中引入的新功能rowid功能:

setDT(df)[, Seq:=rowid(IDPath)] 
1

这可能是一个有点冗长的方法,但它很简单,

alphabets <- c("a", "a", "b", "c", "c") 
df <- data.frame(alphabets) 
a <- table(df$alphabets) 
k <- 1 


for (i in 1:length(a)) 
{ 
l <- 1 
for(j in 1:a[i]) 
{ 
    df$seq[k] <- l 
    k <- k+ 1 
    l <- l+ 1 
} 
} 

df 
# alphabets seq 
#1   a 1 
#2   a 2 
#3   b 1 
#4   c 1 
#5   c 2