追溯-查找字符串值是否出现在另一个特定字符串值之前-dplyr/R

追溯-查找字符串值是否出现在另一个特定字符串值之前-dplyr/R,r,dplyr,stringr,R,Dplyr,Stringr,我在R中遇到了一个普遍的问题。我想知道是否有办法确定一个特定的字符串值是否在一个组中的另一个特定字符串值之后出现。数据集是一个时间序列。每组10年 我想要下面这样的东西,但我希望在小组内每年“stringvalue1”之前看看,而不是滞后 mutate(new_var = if_else(stringvar = "stringvalue1" & lag(stringvar) %in% c("stringvalue2", "stringvalue3"), "Match", "Not mat

我在R中遇到了一个普遍的问题。我想知道是否有办法确定一个特定的字符串值是否在一个组中的另一个特定字符串值之后出现。数据集是一个时间序列。每组10年

我想要下面这样的东西,但我希望在小组内每年“stringvalue1”之前看看,而不是滞后

mutate(new_var = if_else(stringvar = "stringvalue1" & lag(stringvar) %in% c("stringvalue2", "stringvalue3"), "Match", "Not match"))  
非常感谢您的帮助

library(dplyr)

match_if_precedes <- function(column, this_string, preceded_by)
{
  matches    <- which(column == this_string)
  if (length(matches) == 0) return(rep("No Match", length(column)))
  last_match = matches[length(matches) - 1]
  if (last_match == 0) return(rep("No Match", length(column)))
  any_matches <- !is.na(preceded_by %in% column[1:last_match])
  if(length(any_matches) == 0) return(rep("No Match", length(column)))
  any_matches <- any(any_matches)
  if(any_matches) return(rep("Match", length(column)))
  return(rep("No Match", length(column)))
}

df1 <- structure(list(group = c("A", "A", "A", "A", "A",  
                               "B", "B", "B", "B", "B", 
                               "C", "C", "C", "C", "C"), 
                     stringvar = c("stringvalue4", "stringvalue2", "stringvalue1", "stringvalue1", "stringvalue1", 
                                   "stringvalue1", "stringvalue1", "stringvalue1", "stringvalue1","stringvalue4", 
                                   "stringvalue4", "stringvalue2", "stringvalue3", "stringvalue3", "stringvalue4")),
                                   row.names = c(NA, -15L), class = "data.frame")
df1 %>% 
  group_by(group) %>% 
  mutate(newvar = match_if_precedes(stringvar, "stringvalue1", 
                                    c("stringvalue2", "stringvalue3"))) 

   group stringvar    newvar  
   <chr> <chr>        <chr>   
 1 A     stringvalue4 Match   
 2 A     stringvalue2 Match   
 3 A     stringvalue1 Match   
 4 A     stringvalue1 Match   
 5 A     stringvalue1 Match   
 6 B     stringvalue1 Match   
 7 B     stringvalue1 Match   
 8 B     stringvalue1 Match   
 9 B     stringvalue1 Match   
10 B     stringvalue4 Match   
11 C     stringvalue4 No Match
12 C     stringvalue2 No Match
13 C     stringvalue3 No Match
14 C     stringvalue3 No Match
15 C     stringvalue4 No Match
库(dplyr)

match_如果_在之前,您可以定义一个函数,如果满足条件,该函数将返回一个“match”向量,如果不满足条件,该函数将返回一个“No match”向量。这些将与输入列的长度相同

我添加了大量注释以说明该功能的工作原理:

#此函数接受一个名为“column”的字符串向量。它查找
#单个字符串`this_string`和任何字符串矢量`inthein`
#`column`。如果它在最后一个实例之前的向量中找到任何`前面有`的成员
#对于'this_string',它返回字符串“Match”的向量,其长度与
#原始的“column”向量。在所有其他情况下,它返回一个“不匹配”的向量

match_如果_在之前,您可以定义一个函数,如果满足条件,该函数将返回一个“match”向量,如果不满足条件,该函数将返回一个“No match”向量。这些将与输入列的长度相同

我添加了大量注释以说明该功能的工作原理:

#此函数接受一个名为“column”的字符串向量。它查找
#单个字符串`this_string`和任何字符串矢量`inthein`
#`column`。如果它在最后一个实例之前的向量中找到任何`前面有`的成员
#对于'this_string',它返回字符串“Match”的向量,其长度与
#原始的“column”向量。在所有其他情况下,它返回一个“不匹配”的向量

如果你在前面,那就匹配吧,谢谢艾伦。我没有完全听懂。:)对R来说还是很新的。我要寻找的是一个匹配,当stringvalue2或stringvalue3在时间序列中出现在stringvalue1之前。啊,对不起,Henrik-我以为是另一种情况。我将在一分钟内更新。我的问题因不清楚而受到批评,谢谢你的努力@Henrik更新的版本符合你的要求吗?不,恐怕不行。隐马尔可夫模型。。。假设我们有组A。如果组中出现stringvalue1,并且stringvalue2或stringvalue3出现在stringvalue1之前,我希望该组是“匹配”(组中的所有行)。您的函数似乎只查找滞后值?如果stringvalue 2比第一个stringvalue 1早三年,则找不到匹配项。嗯…谢谢你,艾伦。我没有完全听懂。:)对R来说还是很新的。我要寻找的是一个匹配,当stringvalue2或stringvalue3在时间序列中出现在stringvalue1之前。啊,对不起,Henrik-我以为是另一种情况。我将在一分钟内更新。我的问题因不清楚而受到批评,谢谢你的努力@Henrik更新的版本符合你的要求吗?不,恐怕不行。隐马尔可夫模型。。。假设我们有组A。如果组中出现stringvalue1,并且stringvalue2或stringvalue3出现在stringvalue1之前,我希望该组是“匹配”(组中的所有行)。您的函数似乎只查找滞后值?如果stringvalue 2比第一个stringvalue 1早三年,则找不到匹配项。嗯……通常情况下,如果你能提供一个可复制的数据示例并提供预期的输出,就更容易得到帮助。通常,如果你能提供一个可复制的数据示例并提供预期的输出,就更容易得到帮助。
df <- structure(list(group = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
    stringvar = c("stringvalue4", "stringvalue2", "stringvalue1", 
    "stringvalue1", "stringvalue1", "stringvalue1", "stringvalue1", 
    "stringvalue1", "stringvalue1", "stringvalue4", "stringvalue4", 
    "stringvalue2", "stringvalue3", "stringvalue3", "stringvalue1"
    )), row.names = c(NA, -15L), class = "data.frame")

find_these  <- c("stringvalue2", "stringvalue3")
before_this <- "stringvalue1"
#>    group    stringvar   newvar
#> 1      A stringvalue4    Match
#> 2      A stringvalue2    Match
#> 3      A stringvalue1    Match
#> 4      A stringvalue1    Match
#> 5      A stringvalue1    Match
#> 6      B stringvalue1 No Match
#> 7      B stringvalue1 No Match
#> 8      B stringvalue1 No Match
#> 9      B stringvalue1 No Match
#> 10     B stringvalue4 No Match
#> 11     C stringvalue4    Match
#> 12     C stringvalue2    Match
#> 13     C stringvalue3    Match
#> 14     C stringvalue3    Match
#> 15     C stringvalue1    Match