簡體   English   中英

R中具有列表的data.table賦值運算符

[英]data.table assignment operator with lists in R

我有一個包含name列的data.table,並且正在嘗試從該名稱提取正則表達式。 在這種情況下,最明顯的方法是使用:=運算符,因為我將提取的字符串分配為數據的實際名稱。 這樣,我發現這實際上並沒有按照我期望的方式應用該功能。 我不確定它是否是故意的,並且我想知道它是否有做它的原因或它是否是一個錯誤。

library(data.table)
dt <- data.table(name = c('foo123', 'bar234'))

在簡單的字符向量中搜索所需的表達式的行為符合預期:

name <- dt[1, name]
pattern <- '(.*?)\\d+'
regmatches(name, regexec(pattern, name))
[[1]]
[1] "foo123" "foo"  

我可以輕松地將其子集化以獲得我想要的

regmatches(name, regexec(pattern, name))[[1]][2]
[1] "foo"

但是,當我嘗試將其應用於整個data.table時遇到問題:

dt[, name_final := regmatches(name, regexec(pattern, name))[[1]][2]]
dt
    name name_final
1: foo123        foo
2: bar234        foo

我不知道data.table在內部如何工作,但是我猜想該函數將首先應用於整個name列,然后將結果以某種方式強制轉換為向量,然后分配給新的name_final列。 但是,我在這里期望的行為是逐行的。 我可以通過添加一個虛擬id列來模擬這種行為。

dt[, id := seq_along(name)]
dt[, name_final := regmatches(name, regexec(pattern, name))[[1]][2], by = list(id)]
dt
    name name_final id
1: foo123        foo  1
2: bar234        bar  2

是否有這不是默認行為的原因? 如果是這樣,我猜想這與data.table的原子列有關,而不是與行有關,但是我想了解那里發生了什么。

R中幾乎沒有任何內容是逐行運行的。 一次處理數據列總是更好,因此您可以非常假設值的整個列向量都將作為參數傳遞給函數。 這是為regmatches列表中的每個項目提取第二個元素的方法

dt[, name_final := sapply(regmatches(name, regexec(pattern, name)), `[`, 2)]

諸如sapply()Vectorize()類的函數可以“偽造”每行類型的調用,這些調用不希望一次在向量/數據列表上運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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