Re: [问题] grepl与循环使用

楼主: celestialgod (天)   2016-10-17 20:35:52
※ 引述《huangsam (sam)》之铭言:
: [软件熟悉度]:
: 请把以下不需要的部份删除
: 入门(写过其他程式,只是对语法不熟悉)
:
: [问题叙述]:
: 请简略描述你所要做的事情,或是这个程式的目的
: 手上有两个档案,分别是参照表以及原始档
: 其中一个参照表为
: EX:
: 档案DT
: 1 ^123.* A
: 2 ^234.* B
: .
: .
: .
: 原始档为
: 档案DT2
: 1. 123456
: 2. 23456
: 经由比对可以发现
: 1.=>为A
: 2.=>为B
: [你的答案]:
:
: 我的写法是用循环方式然后
: 想请问有没有更好的写法
: ansewer <- c()
: for (i in 1:nrow(DT))
: {
: ind <- grepl(DT[i, 1, with=F], DT2)
: for(j in which(ind==1))
: {
: ansewer[j] <- ifelse(TYPE[j]==0, DT2[i],ansewer[j] )
: }
: }
:
: [关键字]:
:
: grepl
:
好读版: http://pastebin.com/cZWwyGGH
library(data.table)
library(stringr)
library(pipeR)
library(zoo)
# 产生资料
numDigits <- 6
numRows <- 1000
DT2 <- data.table(str = rollapply(sample(9, numRows*numDigits, TRUE),
numDigits, function(x) str_c(x, collapse = ""),
by = numDigits), value = NA_character_)
# 产生mapping table
allPatterns <- substring(DT2$str,1,3) %>>% unique %>>% sort
DT <- data.table(pattern = str_c("^", allPatterns, ".*"),
value = sprintf("A%03i", 1:length(allPatterns)))
# mapping开始
st <- proc.time()
for (i in 1:nrow(DT))
set(DT2, which(str_detect(DT2$str, DT$pattern[i])),
which(names(DT2) == "value"), DT$value[i])
proc.time() - st
# user system elapsed
# 0.11 0.00 0.11
# 如果会有string map到两种pattern,取最前面的pattern
# 就在第一个which里面加上 & !is.na(DT2$value)条件
# 取最后面的话就不用改
print(DT2)
# str value
# 1: 588847 A297
# 2: 472447 A225
# 3: 181823 A048
# 4: 928228 A495
# 5: 331838 A139
#

Links booklink

Contact Us: admin [ a t ] ucptt.com