【发布时间】:2019-11-21 05:56:55
【问题描述】:
作为 R 的新手,我正在寻找一种有效的方法来执行具有两个条件的 VLOOKUP 类似物的循环。 VLOOKUP 允许在整个列中查找特定值并将其应用于我的数据框的每一行。
我有一个长的 data.frame DF 3 个变量:
-
Car:被观察物品(汽车)的识别号。每辆车都是独一无二的,但不是每排都有。 -
Date:观察日期,格式="%Y-%m-%d" -
Area:逻辑变量显示对此Date的观察(Car)是否在某个区域(真)或不(假)
我需要创建一个新的二进制变量 AreaChange,它显示 如果 Area 在接下来的 10 天内为此 Car 发生变化:如果是则为 1,如果没有变化则为 0 . 我也对一个变化方向感兴趣:从 FALSE 到 TRUE。
Area 在接下来的 10 天内有可能发生多次变化,如果至少有一个变化是从 FALSE 变为 TRUE,则 AreaChange 应该等于 1。
也有可能在某些时期观察到一些Cars 不到10 天,在这些情况下还需要AreaChange 计算。
示例数据集可能如下所示:
set.seed(1)
DF <- data.frame(
Cars=as.integer(sample(127345:127346, 2000, replace=T)), #2 cars sample
Date=as.Date
(seq(from = as.Date("2015-12-21"), to=as.Date("2017-01-30"), length.out = 2000)),
Area=as.logical(sample(x=c(0,1), prob=c(.7, .3), size=2000, replace=T)))
DF <- DF[!duplicated(DF[,c("Cars","Date")]),] #795 observations
对我来说它看起来像:
- 为每行提取 10 个
FutureArea值,匹配两个参数:Car和Date之间相同(Date和Date+10)。我想它可以在 10 天内以 循环 格式完成。 - 如果所有可用的
FutureArea值都相同,或者如果该行的当前Area为TRUE,则创建等于0 的二进制新变量AreaChange。
我找到了关于合并 2 个数据框或仅在 1 个条件下匹配或在未来几天不提取 Area 值的案例的建议,但没有设法将它们组合到我的案例中。
目前,我只设法获得了 AreaChange,忽略了匹配 Car 的需要,并将 Area 与 10 天内的 Area 进行比较,而不是接下来 10 天内的每一天。
DF$Date10 <- DF$Date+10
library(expss)
DF$Area10 <- vlookup(DF$Date10, DF[,1:3], result_column = 3, lookup_column = 2)
DF$AreaChange10 <- ifelse(DF$Area10!=DF$Area & DF$Area==FALSE, 1, 0)
所需的输出是AreaChange 列,例如as following:
- 如果在当前
Date和Date+10 之间发生Area从 FALSE 到 TRUE 的切换,对于给定的Car,则等于 1,无论这些天的 NA 值的数量是多少,李> - 否则等于 0。
Cars Date Area AreaDay0 AreaDay+1 AreaDay+2 AreaDay+3 AreaDay+4 AreaDay+5 AreaDay+6 AreaDay+7 AreaDay+8 AreaDay9 AreaDay+10 AreaChange Comment
127345 12/21/15 TRUE 1 0 0 0 1 1 0 0 NA 1 0 1 yes,_as_includes_switch_from_0_to_1
127346 12/21/15 TRUE 1 1 1 0 0 0 0 0 0 0 0 0 no,_as_the_switch_is_from_1_to_0
127347 12/22/15 FALSE 0 0 0 0 0 0 0 0 0 0 0 0 no,_as_no_switch
127348 12/22/15 FALSE 0 0 0 0 0 0 0 NA 1 0 0 1 yes,_as_includes_switch_from_0_to_1
127349 12/23/15 TRUE 1 1 1 1 1 1 NA 1 1 1 1 0 no,_as_no_switch
127350 12/21/15 FALSE 0 NA NA NA NA NA NA NA NA NA 1 1 yes,_as_includes_switch_from_0_to_1
非常感谢您对如何优化和继续提出任何建议。
【问题讨论】:
-
欢迎来到 SO,NLavins!请让这个问题可重现。这包括示例代码(包括列出非基本 R 包)、示例明确数据(例如,
dput(head(x))或data.frame(x=...,y=...))和预期输出。参考:stackoverflow.com/questions/5963269、stackoverflow.com/help/mcve 和 stackoverflow.com/tags/r/info。 -
感谢您提供解释和链接的建议。这无疑使案件更加清楚。我添加了一个代码部分来生成示例数据集,以及所需输出变量的逻辑示例。
标签: r for-loop if-statement match vlookup