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补充了一个解释。