R 在data.table中包含迭代循环的矢量化函数

R 在data.table中包含迭代循环的矢量化函数,r,data.table,R,Data.table,我有一个数据集,在那里我需要根据邮政编码的结构规则反复提取邮政编码。我首先需要检测“AA00 0AA”,然后才能检测“A00 0AA”,因为如果我还没有排除它,第二个也会检测第一个。我不是在寻找解决方法(比如通过在正则表达式前面添加空格或类似的方法来改进正则表达式),我只是试图直观地理解以下问题,因为我的工作中出现了更多具有类似问题的函数: 数据: 我可以通过一个向量来循环它: for(i in 1:2){ print(my_postcode_fun(testdata[i,])) } 当我

我有一个数据集,在那里我需要根据邮政编码的结构规则反复提取邮政编码。我首先需要检测“AA00 0AA”,然后才能检测“A00 0AA”,因为如果我还没有排除它,第二个也会检测第一个。我不是在寻找解决方法(比如通过在正则表达式前面添加空格或类似的方法来改进正则表达式),我只是试图直观地理解以下问题,因为我的工作中出现了更多具有类似问题的函数:

数据:

我可以通过一个向量来循环它:

for(i in 1:2){
  print(my_postcode_fun(testdata[i,]))
}
当我强制data.table按行运行时,它也起作用:

new <- testdata[, c("postcode", "Address"):= 
                  my_postcode_fun(Address), 
                  by = seq_len(nrow(testdata))]
new
我想有两个问题,如果我错了,请纠正我

第一个问题是data.table对每一行执行整个操作,然后进入循环的下一步。您可以通过注释掉函数中的“break”来看到这一点,在这种情况下,它只返回循环的第二步(可能已经覆盖了第一步)

我认为第二个问题是“break”将停止所有行的循环。至少这是我对data.table如何处理循环的直觉。如果没有找到特定行的任何内容,我希望它继续。第一步适用于所有元素,第二步适用于所有元素等


那么,我如何将其矢量化,并在data.table中使用它,并且有一个迭代(!)循环,它需要在允许第二步发生之前先发生第一步?我试图使示例更简单,但我害怕错过重要的部分,因为我不完全理解它。

对于矢量化版本,要使用双
数据。表
列赋值,函数应返回双列表,一个用于地址,一个用于邮政编码。
由于您的原始函数返回一个邮政编码+地址列表,因此我必须转换此列表以获得预期的格式。
这是可行的,但我不确定它是否比您测试的其他解决方案更有效。
另一点是在从
数据中获得的
地址
向量上循环。使用
时,表
:=

库(data.table)
图书馆(stringr)

testdata对于矢量化版本,要使用双
数据表
列分配,函数应返回双列表,一个用于地址,一个用于邮政编码。
由于您的原始函数返回一个邮政编码+地址列表,因此我必须转换此列表以获得预期的格式。
这是可行的,但我不确定它是否比您测试的其他解决方案更有效。
另一点是在从
数据中获得的
地址
向量上循环。使用
时,表
:=

库(data.table)
图书馆(stringr)

testdata首先,
if
条件需要单个逻辑,而不是向量,如果
myscalar
的长度超过1(或仅为0),则它将失败。此外,在某种意义上,
if
确实应该有一个向量化的比较,因为您可能有一个模式匹配一个模式,而不是所有模式,等等

对于这一点,人们可能认为
ifelse
是一种向量化的
if
/
else
替代方法,但我认为另一种方法是一种简化方法,即在任何尚未匹配的输入上尝试每个模式,并在所有输入都匹配时停止处理



my_postcode_fun首先,
if
条件需要单个逻辑,而不是向量,如果
myscalar
的长度超过1(或仅为0),则它将失败。此外,在某种意义上,
if
确实应该有一个向量化的比较,因为您可能有一个模式匹配一个模式,而不是所有模式,等等

对于这一点,人们可能认为
ifelse
是一种向量化的
if
/
else
替代方法,但我认为另一种方法是一种简化方法,即在任何尚未匹配的输入上尝试每个模式,并在所有输入都匹配时停止处理



我的_postcode _fun旁白:2个邮政编码的案例非常相关,我最多有4个。我只是希望能有一个功能,我可以运行多次,以获得邮政编码的邮政编码。我认为你的作品就是这样。看我的编辑,我认为它解决了你的问题。旁白:2个邮政编码的案例非常相关,我最多有4个。我只是希望能有一个功能,我可以运行多次,以获得邮政编码的邮政编码。我认为你的作品就是这样。看我的编辑,我认为它解决了你的问题。
my_postcode_fun(testdata[1])
for(i in 1:2){
  print(my_postcode_fun(testdata[i,]))
}
new <- testdata[, c("postcode", "Address"):= 
                  my_postcode_fun(Address), 
                  by = seq_len(nrow(testdata))]
new
testdata[, c("postcode", "Address"):= 
           my_postcode_fun(Address)]