我有来自以这种格式导出的实验的聊天记录:
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
的内容来实现第二部分,所以上。但是,我无法弄清楚这第二部分。有任何想法吗?
答案 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)然后执行累积和。