根据模式的实例分配唯一ID

时间:2015-07-13 22:28:02

标签: r

我有来自以这种格式导出的实验的聊天记录:

df = data.frame(
   subject = c("string",1,2,3,"string", 2, 3, "string", 1,1,3,4),
   text = c(rep("blah blah blah", 12)), 
   period = c(rep("NA", 12))
  )

> head(df)
  subject           text period
  1  string blah blah blah     NA
  2       1 blah blah blah     NA
  3       2 blah blah blah     NA
  4       3 blah blah blah     NA
  5  string blah blah blah     NA
  6       2 blah blah blah     NA

其中"字符串"是整个列中重复的一些标识符文本。

我想写一个函数,a)识别subject列中的字符模式,b)根据模式的每个实例为period赋值。

例如,我知道我可以通过运行

来实现第一部分
> grepl("s+", df$subject, perl = T)
 [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

从那里通过运行为period == 1的第一个实例分配TRUE,为period == 2的第二个实例分配TRUE的内容来实现第二部分,所以上。但是,我无法弄清楚这第二部分。有任何想法吗?

1 个答案:

答案 0 :(得分:5)

我不确定您的所需输出,但假设您没有period列(您将其设为空因子列,其值很难更改),请使用{{ 1}}你可以简单地做

data.table

这基本上只是通过匹配的实例进行子集,然后使用df = data.frame( subject = c("string",1:3,"string", 2:3, "string", 1,1,3,4), text = "blah blah blah" ) library(data.table) setDT(df)[grep("s+", subject), period := seq_len(.N)] df # subject text period # 1: string blah blah blah 1 # 2: 1 blah blah blah NA # 3: 2 blah blah blah NA # 4: 3 blah blah blah NA # 5: string blah blah blah 2 # 6: 2 blah blah blah NA # 7: 3 blah blah blah NA # 8: string blah blah blah 3 # 9: 1 blah blah blah NA # 10: 1 blah blah blah NA # 11: 3 blah blah blah NA # 12: 4 blah blah blah NA 运算符(在本例中为3)获取子集的长度,并通过引用分配 (使用.N运算符)3的序列,:=到子集中的1,2,3列。

除非你只是想要

period

这只是对您的解决方案的修改,它基本上将您的逻辑向量转换为二进制(cumsum(grepl("s+", df$subject)) ## [1] 1 1 1 1 2 2 2 3 3 3 3 3 变为1而TRUE变为0)然后执行累积和。