【问题标题】:How to create a column based on two conditions from other data frame?如何根据其他数据框中的两个条件创建列?
【发布时间】:2019-08-29 00:58:43
【问题描述】:

我正在尝试创建一个列来标识该行是否满足两个条件。比如我有一个类似这样的表:

> dat <- data.frame(Date = c(rep(c("2019-01-01", "2019-02-01","2019-03-01", "2019-04-01"), 4)),
+                   Rep = c(rep("Mike", 4), rep("Tasha", 4), rep("Dane", 4), rep("Trish", 4)),
+                   Manager = c(rep("Amber", 2), rep("Michelle", 2), rep("Debbie", 4), rep("Brian", 4), rep("Tim", 3), "Trevor"),
+                   Sales = floor(runif(16, min = 0, max = 10)))
> dat                  
         Date   Rep  Manager Sales
1  2019-01-01  Mike    Amber     6
2  2019-02-01  Mike    Amber     3
3  2019-03-01  Mike Michelle     9
4  2019-04-01  Mike Michelle     2
5  2019-01-01 Tasha   Debbie     9
6  2019-02-01 Tasha   Debbie     6
7  2019-03-01 Tasha   Debbie     0
8  2019-04-01 Tasha   Debbie     4
9  2019-01-01  Dane    Brian     3
10 2019-02-01  Dane    Brian     6
11 2019-03-01  Dane    Brian     6
12 2019-04-01  Dane    Brian     1
13 2019-01-01 Trish      Tim     6
14 2019-02-01 Trish      Tim     7
15 2019-03-01 Trish      Tim     6
16 2019-04-01 Trish   Trevor     1

在更换经理的销售代表中,我想确定这位经理是该日期的第一任经理还是第二任经理。理想的输出如下所示:

         Date   Rep  Manager Sales  New_Column
1  2019-01-01  Mike    Amber     6           1
2  2019-02-01  Mike    Amber     3           1
3  2019-03-01  Mike Michelle     9           2
4  2019-04-01  Mike Michelle     2           2
5  2019-01-01 Trish      Tim     6           1
6  2019-02-01 Trish      Tim     7           1
7  2019-03-01 Trish      Tim     6           1
8  2019-04-01 Trish   Trevor     1           2

我尝试了一些方法,但效果不佳。我创建了两个单独的数据框,其中一个由该 Rep 的第一个实例和关联的管理器 (df1) 组成,另一个由该代表的最后一个实例和关联的管理器 (df2) 组成。我尝试过的最接近的代码是:

dat$New_Column <- ifelse(dat$Rep %in% df1$Rep & dat$Manager %in% df1$Manager, 1,
                         ifelse(dat$Rep %in% df2$Rep & dat$Manager %in% df2$Manager, 2, NA))

但是,这读作两个单独的条件,而不是一个条件的条件(即,如果 Mike 在第一个实例中存在并且 Amber 在第一个实例中存在分配 1,而不是如果 Mike 在第一个实例中与经理 Amber 存在分配 1).任何帮助将非常感激。谢谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    一个选项是首先按“Rep”filter 将唯一“Manager”的数量为 2 的行分组,然后通过 matching 使用带有 unique 元素的“Manager”添加一列'Manager' 获取索引

    library(dplyr)
    dat %>% 
      group_by(Rep) %>% 
      filter(n_distinct(Manager) == 2) %>%
      mutate(New_Column = match(Manager, unique(Manager)))
    # A tibble: 8 x 5
    # Groups:   Rep [2]
    #  Date       Rep   Manager  Sales New_Column
    #  <chr>      <chr> <chr>    <int>      <int>
    #1 2019-01-01 Mike  Amber        6          1
    #2 2019-02-01 Mike  Amber        3          1
    #3 2019-03-01 Mike  Michelle     9          2
    #4 2019-04-01 Mike  Michelle     2          2
    #5 2019-01-01 Trish Tim          6          1
    #6 2019-02-01 Trish Tim          7          1
    #7 2019-03-01 Trish Tim          6          1
    #8 2019-04-01 Trish Trevor       1          2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      • 2020-06-02
      • 1970-01-01
      • 2018-11-06
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多