【发布时间】:2018-05-29 04:37:44
【问题描述】:
我有一个两列数据框。第一列是时间戳,第二列是某个值。例如:
library(tidyverse)
set.seed(123)
data_df <- tibble(t = 1:15,
value = sample(letters, 15))
我有另一个数据框,它指定需要更新的时间戳范围及其对应的值。例如:
criteria_df <- tibble(start = c(1, 3, 7),
end = c(2, 5, 10),
value = c('a', 'b', 'c')
)
这意味着我需要改变 data_df 中的 value 列,使其从 t=1 到 t=2 的值是 'a',从 t=3 到 t=5 是 'b',从 t=7 到t=10 是“c”。
在 R 中推荐的方法是什么?
我能想到的唯一方法是循环criteria_df中的每一行并在过滤t列后改变data_df中的值列,如下所示:
library(iterators)
library(foreach)
foreach(row = row_iter, .combine = c) %do% {
seg_start = row$start
seg_end = row$end
new_value = row$value
data_df %<>%
mutate(value = if_else(between(t, seg_start, seg_end),
new_value,
value))
NULL
}
【问题讨论】:
-
您想替换
value列中的值,对吗?那么值 11 到 15 呢?他们会保持原样吗? -
您愿意接受
data.table解决方案吗?我认为这应该是一个更新加入 -data_df[criteria_df, on=c("t>=start","t<=end"), value := i.value] -
@RonakShah 是的,11 到 15 的值将保持不变。
-
在这种情况下,@thelatemail 提供的解决方案将起作用。
-
@thelatemail 感谢
data.table的提示。我想一个 tidyverse 解决方案是不可能的,因为dplyr不支持非等连接?