【发布时间】:2018-12-11 02:16:21
【问题描述】:
我有一个包含多个时间序列(值~时间)的 df(“df”),其观察结果按 3 个因素分组:温度、代表和物种。这些数据需要在时间序列的上下端进行修剪,但这些阈值是有条件的(例如,删除低于 2 和高于 10 的观察值,其中 temp=10、rep=2 和 species =“A”)。 我有一个随附的 df (df_thresholds),其中包含分组值以及我想为每个组使用的最小值和最大值。并非所有组都需要修剪(我想定期更新此文件,以指导修剪 df 的位置)。 谁能帮我按组有条件地过滤掉这些值?我有以下,很接近但不完全在那里。当我反转最大和最小布尔测试时,我得到零观察值。
df <- data.frame(species = c(rep("A", 16), rep("B", 16)),
temp=as.factor(c(rep(10,4),rep(20,4),rep(10,4),rep(20,4))),
rep=as.factor(c(rep(1,8),rep(2,8),rep(1,8),rep(2,8))),
time=rep(seq(1:4),4),
value=c(1,4,8,16,2,4,9,16,2,4,10,16,2,4,15,16,2,4,6,16,1,4,8,16,1,2,8,16,2,3,4,16))
df_thresholds <- data.frame(species=c("A", "A", "B"),
temp=as.factor(c(10,20,10)),
rep=as.factor(c(1,1,2)),
min_value=c(2,4,2),
max_value=c(10,10,9))
#desired outcome
df_desired <- df[c(2:3,6:7,9:24,26:27,29:nrow(df)),]
#attempt
df2 <- df
for (i in 1:nrow(df_thresholds)) {
df2 <- df2 %>%
filter(!(species==df_thresholds$species[i] & temp==df_thresholds$temp[i] & rep==df_thresholds$rep[i] & value>df_thresholds$min_value[i] & value<df_thresholds$max_value[i]))
}
编辑:这是我根据以下建议实施的解决方案。
df_test <- left_join(df, df_thresholds, by=c('species','temp','rep'))
df_test$min_value[is.na(df_test$min_value)] <- 0
df_test$max_value[is.na(df_test$max_value)] <- 999
df_test2 <- df_test %>%
filter(value >= min_value & value <= max_value)
【问题讨论】:
-
我不确定预期的结果应该是什么,但一个选项可能是将两个 df 与
left_join连接起来,并将您的过滤器应用于生成的 dfdf_test <- left_join(df, df_thresholds, by=c("species", 'temp', 'rep')) %>% filter(value > min_value & value < max_value ) -
您可以使用
data.table::foverlaps,使用此功能您可以(快速!)执行重叠连接...阅读本主题中的答案:stackoverflow.com/questions/24480031/…。 -
我添加了期望的结果,但我想指出我想通过约束时间变量而不是值来进行子集化。
-
@NColl,非常感谢。通过将我的限制加入 df 并过滤值变量,我排除了我想要的所有内容。