[英]Assign unique ID based on instances of a pattern
我有來自實驗的聊天記錄,該記錄以以下格式導出:
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
,依此類推。 但是我不知道這第二部分。 有任何想法嗎?
我不確定所需的輸出,但是假設您沒有period
列(將其設置為一個空的因子列,其值很難更改),則可以使用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的序列,到子集中的period
1,2,3
除非你只想
cumsum(grepl("s+", df$subject))
## [1] 1 1 1 1 2 2 2 3 3 3 3 3
這僅僅是對您的解決方案的修改,基本上是將邏輯矢量轉換為二進制矢量( TRUE
變為1, FALSE
變為0),然后執行累加和。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.