【问题标题】:How to id the rows that are between a match of string in r如何识别r中字符串匹配之间的行
【发布时间】:2019-07-18 16:40:44
【问题描述】:

我希望能够识别具有唯一值的香蕉之间的水果,并且最后一根香蕉也标有该唯一值。其他所有内容,例如在第一个香蕉之前或最后一个香蕉之后,或者如果连续有两个、三个香蕉 - 不符合我的兴趣 - 它们可以有 0 作为值或被删除。如果我听起来太混乱,请参考所需的输出。我希望有人有一个想法。我一直在谷歌搜索和 stackoverflow 没有任何成功。我希望以前没有人问过这件事并不容易。

  fruits <- c("apples", "pears","bananas", "cherries")
  customer <- rep(c(1:10), each = 3)
  set.seed(1236)
  df_fruits <- data.frame(customer = sample(customer, 30, replace = T),
                    fruits = sample(fruits,30, replace = T, prob=c(0.29,0.60,0.5,0.1)))
  df_fruits <- distinct(df_fruits,.keep_all = T)
  df_fruits

期望的输出

    customer   fruits section
1         8    pears       0
2         7 cherries       0
3         5  bananas       0
4         5    pears       1
5        10  bananas       1
6         9    pears       2
7        10    pears       2
8         1   apples       2
9         1    pears       2
10        4    pears       2
11        6    pears       2
12        6 cherries       2
13        4   apples       2
14        8   apples       2
15        2    pears       2
16        1  bananas       2
17        8  bananas       0
18        9  bananas       0
19        3  bananas       0
20        3    pears       3
21        2  bananas       3

提前谢谢你!

【问题讨论】:

    标签: r dplyr tidyverse data-manipulation


    【解决方案1】:

    我不确定我是否理解你想如何处理香蕉,但这可能会让你更接近你需要的东西:

    library(dplyr)
    
    df_fruits %>%
      mutate(section = lag(cumsum(ifelse(fruits != lag(fruits) & fruits == "bananas", 1, 0)), default=0)) %>%
      filter (!(fruits == lag(fruits) & fruits == "bananas"))
    
    customer   fruits section
    1         8    pears       0
    2         7 cherries       0
    3         5  bananas       0
    4         5    pears       1
    5        10  bananas       1
    6         9    pears       2
    7        10    pears       2
    8         1   apples       2
    9         1    pears       2
    10        4    pears       2
    11        6    pears       2
    12        6 cherries       2
    13        4   apples       2
    14        8   apples       2
    15        2    pears       2
    16        1  bananas       2
    17        3    pears       3
    18        2  bananas       3
    

    编辑:我添加了过滤器以删除我刚刚读到的重复香蕉。

    【讨论】:

    • 是的,你的方法让我非常接近我所追求的。非常感谢,向你学习。如果我不想在香蕉之间保留重复的水果,那么:df_fruits$fruits &lt;- as.character(df_fruits$fruits) df_fruits &lt;- df_fruits %&gt;% filter(fruits != lag(fruits, default="bananas")) 然后your code 让我找到了正确的部分。 - 一切顺利!
    • 抱歉,我发表评论时没有看到更新版本。谢谢!
    【解决方案2】:

    您的输入数据和所需的输出具有不同的行数。 使用您想要的输出作为输入数据,这是dplyr 的一种方法。 output 是计算列,可以与您的 section 列进行比较 -

    test <- df_fruits$fruits == "bananas"
    df_fruits %>% 
      filter(!(test & lag(test))) %>% 
      mutate(
        output = cumsum(t <- fruits == "bananas") - t
      )
    
       customer   fruits section output
    1         8    pears       0      0
    2         7 cherries       0      0
    3         5  bananas       0      0
    4         5    pears       1      1
    5        10  bananas       1      1
    6         9    pears       2      2
    7        10    pears       2      2
    8         1   apples       2      2
    9         1    pears       2      2
    10        4    pears       2      2
    11        6    pears       2      2
    12        6 cherries       2      2
    13        4   apples       2      2
    14        8   apples       2      2
    15        2    pears       2      2
    16        1  bananas       2      2
    17        3    pears       3      3
    18        2  bananas       3      3
    

    【讨论】:

    • 不同的结果可能是由于不同 r 版本的种子。你的方法保持香蕉之间的重复——这确实是我的意图。我需要一些时间来理解和采用你的方法。 :) 非常感谢你! - 一切顺利!
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 2019-10-16
    • 2014-07-04
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多