假设我有一个数据框,其中包含一堆数据和一个日期/时间列,指示何时收集每个数据点.我有另一个列出时间跨度的数据框,其中"开始"列表示每个跨距开始的日期/时间,"结束"列表示每个跨度结束的日期/时间.
我在下面使用简化数据创建了一个虚拟示例:
main_data = data.frame(Day=c(1:30))
spans_to_filter =
data.frame(Span_number = c(1:6),
Start = c(2,7,1,15,12,23),
End = c(5,10,4,18,15,26))
Run Code Online (Sandbox Code Playgroud)
我玩弄了几种解决这个问题的方法,最后得到了以下解决方案:
require(dplyr)
filtered.main_data =
main_data %>%
rowwise() %>%
mutate(present = any(Day >= spans_to_filter$Start & Day <= spans_to_filter$End)) %>%
filter(present) %>%
data.frame()
Run Code Online (Sandbox Code Playgroud)
这工作得非常好,但是我注意到如果我有大量数据可能需要一段时间来处理(我假设因为我正在进行逐行比较).我还在学习R的来龙去脉,我想知道是否有更有效的方法来执行此操作,最好是使用dplyr/tidyr?
我有两个数据表:
library(data.table)
d1 <- data.table(grp = c("a", "c", "b", "a"), val = c(2, 3, 6, 7), y1 = 1:4, y2 = 5:8)
d2 <- data.table(grp = rep(c("a", "b", "c"), 2),
from = rep(c(1, 5), each = 3), to = rep(c(4, 10), each = 3), z = 11:16)
Run Code Online (Sandbox Code Playgroud)
我执行一个非等联接,其中'd1'中的'val'值应该落在每个组'grp'的'from'和'to'''''定义的范围内.
d1[d2, on = .(grp, val >= from, val <= to), nomatch = 0]
# grp val y1 y2 val.1 z
# 1: a 1 1 5 4 11
# 2: c 1 …Run Code Online (Sandbox Code Playgroud) 在 R 中data.table,什么时候应该在%between%和 之间%inrange%进行取子集运算?我已经阅读了帮助页面,?between但我仍然对这些差异摸不着头脑。
library(data.table)
X = data.table(a=1:5, b=6:10, c=c(5:1))
> X[b %between% c(7,9)]
a b c
1: 2 7 4
2: 3 8 3
3: 4 9 2
> X[b %inrange% c(7,9)]
a b c
1: 2 7 4
2: 3 8 3
3: 4 9 2
Run Code Online (Sandbox Code Playgroud)
它们在我看来是一样的。有人可以解释一下为什么存在这两种操作吗?
我在运行非等连接(来自 R 的 data.table 库)时发现了奇怪的行为,并且我无法弄清楚为什么会发生这种情况。
为什么在运行非等值连接时,如果我想保留左表的原始值,我需要写入x.colname而不是只写入连接的属性colname内?j
这是我正在谈论的一个可重复的小例子:
library(tidyverse)
library(data.table)
# Setting seed for reproducibility
set.seed(666)
# data.table that contains roadway segments.
# The "frm_dfo" and "to_dfo" columns represent the start and end mileposts
# of each roadway segment. For example, the segment with road_ID=101 refers
# to the portion of IH20 that starts at milepost 10 and ends at milepost 20.
roads = data.table(road_id=101:109,
hwy=c('IH20','IH20','IH20','SH150','SH150','SH150','TX66','TX66','TX66'),
frm_dfo=c(10,20,30,10,20,30,10,20,30),
to_dfo=c(20,30,40,20,30,40,20,30,40),
seg_name=c('Seg 1','Seg 2', 'Seg 3','Seg 10','Seg 20', 'Seg …Run Code Online (Sandbox Code Playgroud)