我有一个长矢量,我需要根据阈值将其分成段.段是超过阈值的连续值.当值低于阈值时,段结束,下一段开始,其中值再次超过阈值.我需要记录每个段的开始和结束索引.
下面是一个低效的实现.写这个最快最合适的方法是什么?这非常难看,我必须假设有一个更清洁的实现.
set.seed(10)
test.vec <- rnorm(100, 8, 10)
threshold <- 0
segments <- list()
in.segment <- FALSE
for(i in 1:length(test.vec)){
# If we're in a segment
if(in.segment){
if(test.vec[i] > threshold){
next
}else{
end.ind <- i - 1
in.segment <- FALSE
segments[[length(segments) + 1]] <- c(start.ind, end.ind)
}
}
# if not in segment
else{
if(test.vec[i] > threshold){
start.ind <- i
in.segment <- TRUE
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:所有解决方案的运行时间
感谢所有的回复,这是有帮助的,非常有启发性的.下面是对所有五种解决方案的小测试(提供的四个加上原始示例).正如您所看到的,这四个都是对原始解决方案的巨大改进,但Khashaa的解决方案是目前最快的解决方案.
set.seed(1)
test.vec <- rnorm(1e6, 8, 10);threshold <- 0
originalFunction <- function(x, threshold){ …Run Code Online (Sandbox Code Playgroud) 我有一个类似下面的矢量,并希望确定列表中的哪些元素是人名,哪些不是.我发现了humaniformat包,它格式化了名称,但遗憾的是并不确定字符串是否实际上是一个名称.我还发现了一些用于实体提取的包,但它们似乎需要实际的文本来进行词性标注,而不是单个名称.
例
pkd.names.quotes <- c("Mr. Rick Deckard", # Name
"Do Androids Dream of Electric Sheep", # Not a name
"Roy Batty", # Name
"How much is an electric ostrich?", # Not a name
"My schedule for today lists a six-hour self-accusatory depression.", # Not a name
"Upon him the contempt of three planets descended.", # Not a name
"J.F. Sebastian", # Name
"Harry Bryant", # Name
"goat class", # Not a name
"Holden, Dave", # Name
"Leon Kowalski", # Name …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Scrapy蜘蛛,每天抓取一组URL.但是,其中一些网站非常大,所以我不能每天抓取整个网站,也不想产生必要的大量流量.
一个老问题(这里)问了类似的问题.但是,upvoted响应只是指向一个代码片段(这里),它似乎需要一些请求实例,尽管在响应中没有解释,也没有在包含代码片段的页面上解释.
我试图理解这一点,但发现中间件有点令人困惑.无论是否使用链接的中间件,一个可以多次运行而不重新编写URL的刮刀的完整示例将非常有用.
我已经发布了下面的代码来推动这项工作,但我不一定需要使用这个中间件.任何可以每天抓取并提取新网址的scrapy蜘蛛都可以.显然,一种解决方案是只写出一个已删除URL的字典,然后检查确认每个新URL是否在字典中,但这似乎非常慢/效率低.
蜘蛛
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
from cnn_scrapy.items import NewspaperItem
class NewspaperSpider(CrawlSpider):
name = "newspaper"
allowed_domains = ["cnn.com"]
start_urls = [
"http://www.cnn.com/"
]
rules = (
Rule(LinkExtractor(), callback="parse_item", follow=True),
)
def parse_item(self, response):
self.log("Scraping: " + response.url)
item = NewspaperItem()
item["url"] = response.url
yield item
Run Code Online (Sandbox Code Playgroud)
项目
import scrapy
class NewspaperItem(scrapy.Item):
url = scrapy.Field()
visit_id = scrapy.Field()
visit_status = scrapy.Field()
Run Code Online (Sandbox Code Playgroud)
中间件(ignore.py)
from scrapy import log
from scrapy.http import Request …Run Code Online (Sandbox Code Playgroud) 我用箭头从一组点到另一组arrows().我想将箭头缩短一个共同的长度,以便它们不与标签重叠.然而,考虑到arrows()将坐标作为输入,人们如何做到这一点并不明显.
例如,这是一个例子.
x <- stats::runif(12); y <- stats::rnorm(12)
i <- order(x, y); x <- x[i]; y <- y[i]
plot(x,y, main = "Stack Example", type = 'n')
text(x = x, y = y, LETTERS[1:length(x)], cex = 2, col = sample(colors(), 12))
s <- seq(length(x)-1) # one shorter than data
arrows(x[s], y[s], x[s+1], y[s+1])
Run Code Online (Sandbox Code Playgroud)
如何缩短箭头以使它们不与标签重叠?
这些都是很好的答案.为了想出一些不会假设点在链中连接的东西,我写了下面的函数,它将x0y0(第1列为x,第2列为y的数据帧)移近xy(格式与x0y0)绝对距离d.
movePoints <- function(x0y0, xy, d){
total.dist <- apply(cbind(x0y0, xy), 1,
function(x) stats::dist(rbind(x[1:2], x[3:4])))
p <- d / total.dist
p <- 1 …Run Code Online (Sandbox Code Playgroud)