从 R 数据框中提取隐藏信息

时间:2021-05-20 20:51:20

标签: r dataframe dplyr

我有一个如下所示的数据框:

person    year    Office        Job      rank
Harry     2002    Los Angeles   CEO       0
Harry     2006    Boston        CEO       0
Harry     2006    Los Angeles   Advisor   1
Harry     2006    Chicago       Chairman  2

Peter     2001    New York      Director  0
Peter     2001    Chicago       CFO       1
Peter     2001    Chicago       COO       2
Peter     2002    Chicago       CEO       0

Lily      2005    Springfield   CEO       0
Lily      2007    New York      CFO       0
Lily      2008    Boston        COO       0
Lily      2011    Chicago       Advisor   0
Lily      2011    New York      board     1
 
Sam       2006    Chicago       COO       0
Sam       2007    Chicago       CFO       0
Sam       2007    Chicago       CEO       1
Sam       2010    New York      Advisor   0

我想知道在个人层面上,谁至少具有以下两种模式中的一种:

  1. 在上一个可用年份,一个办公室的等级为 0,在下一个可用年份,该办公室仍然存在,但等级不再并且应该大于 0(工作无关紧要)。例如,哈利的洛杉矶。

  2. 在下一个可用年份,办公室的排名为 0,而在上一个可用年份,该办公室仍然存在,但排名不再且应大于 0(例如,彼得的芝加哥)。< /p>

请注意,纽约对于 Lily 来说没有上述任何一种情况,因为 2007 年不是 Lily 的前一个可用年份(2008 年是)。

请注意,一个办公室可以在一年内多次出现(工作不同)。山姆的芝加哥展示了一个这样的案例。请注意,虽然芝加哥在 2007 年排名第 1,但在上一个可用年份排名第 0,但芝加哥在 2007 年也排名第 0。

因此,输出应如下所示:

person    yes/no
Harry     1
Peter     1
Lily      0
Sam       0

1 个答案:

答案 0 :(得分:1)

如果我理解正确,我认为这会奏效。你想:

  1. 确定人年办公室中是否有任何工作排名 0
  2. 对于每个人办公室,检查您感兴趣的两个案例(当前行的排名为 0,前一行或下一行的排名都不为 0。如果展开数据框,这将更容易做到)包括每个办公室每个人年的所有组合。
  3. 对于每个人,检查是否有任何行与您指定的任一案例匹配并填充缺失值。
library(tidyverse)
df <- read_table(
"person    year    Office        Job      rank
Harry     2002    Los Angeles   CEO       0
Harry     2006    Boston        CEO       0
Harry     2006    Los Angeles   Advisor   1
Harry     2006    Chicago       Chairman  2
Peter     2001    New York      Director  0
Peter     2001    Chicago       CFO       1
Peter     2001    Chicago       COO       2
Peter     2002    Chicago       CEO       0
Lily      2005    Springfield   CEO       0
Lily      2007    New York      CFO       0
Lily      2008    Boston        COO       0
Lily      2011    Chicago       Advisor   0
Lily      2011    New York      board     1
Sam       2006    Chicago       COO       0
Sam       2007    Chicago       CFO       0
Sam       2007    Chicago       CEO       1
Sam       2010    New York      Advisor   0
"
)
df %>%
  group_by(person, year, Office) %>%
  summarise(any_rank_0 = any(rank == 0)) %>%
  ungroup() %>%
  complete(nesting(person, year), Office) %>%
  arrange(person, Office, year) %>%
  group_by(person, Office) %>%
  mutate(
    case_1 = any_rank_0 & !lead(any_rank_0), #current 0, next not 0
    case_2 = any_rank_0 & !lag(any_rank_0) #current 0, previous not 0
  ) %>%
  group_by(person) %>%
  summarise(result = replace_na(any(case_1) | any(case_2), FALSE))
#> # A tibble: 4 x 2
#>   person result
#>   <chr>  <lgl> 
#> 1 Harry  TRUE  
#> 2 Lily   FALSE 
#> 3 Peter  TRUE  
#> 4 Sam    FALSE

reprex package (v1.0.0) 于 2021 年 5 月 20 日创建