Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于模式实例分配唯一ID_R - Fatal编程技术网

R 基于模式实例分配唯一ID

R 基于模式实例分配唯一ID,r,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 bla

我有一个实验的聊天日志,以这种格式导出:

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
其中,string是在整个列中重复的某个标识符文本

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

例如,我知道我可以通过跑步来完成第一部分

> grepl("s+", df$subject, perl = T)
 [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

然后通过运行一个函数来实现第二部分,该函数为第一个TRUE实例指定period==1,为第二个TRUE实例指定period==2,依此类推。然而,我无法理解第二部分。有什么想法吗

我不确定您想要的输出,但假设您没有周期列,您可以使用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
这基本上是通过匹配的实例进行子集划分,然后使用.N运算符(在本例中为3)获取子集的长度,并使用:=运算符通过引用将3的序列(即1,2,3)分配给子集内的周期列

除非你只是想

cumsum(grepl("s+", df$subject))
## [1] 1 1 1 1 2 2 2 3 3 3 3 3

这只是对解决方案的一个修改,它基本上是将逻辑向量转换为二进制向量,真变为1,假变为0,然后执行累积和

我不确定您想要的输出,但假设您没有周期列,您可以使用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
这基本上是通过匹配的实例进行子集划分,然后使用.N运算符(在本例中为3)获取子集的长度,并使用:=运算符通过引用将3的序列(即1,2,3)分配给子集内的周期列

除非你只是想

cumsum(grepl("s+", df$subject))
## [1] 1 1 1 1 2 2 2 3 3 3 3 3

这只是对解决方案的一个修改,它基本上是将逻辑向量转换为二进制向量,真变为1,假变为0,然后执行累积和

您想要的输出是什么样子的?例如,cumsumgrepls+,df$主题是否有效?您希望的输出是什么样子的?例如,cumsumgrepls+,df$主题有效吗?非常感谢@大卫·阿伦伯格。这两个答案都很有效,尽管我不明白它们是如何起作用的。这个问题似乎比我想象的要简单得多。请你解释一下好吗?@invitus补充了一个解释。非常感谢@大卫·阿伦伯格。这两个答案都很有效,尽管我不明白它们是如何起作用的。这个问题似乎比我想象的要简单得多。请你解释一下好吗?@invitus补充了一个解释。