簡體   English   中英

根據模式實例分配唯一ID

[英]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用於第一實例的TRUEperiod == 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM