【问题标题】:Signal all years where a given patter is observed in R在 R 中观察到给定模式的所有年份
【发布时间】:2022-11-26 23:37:25
【问题描述】:

我有一个像这样的数据集:

year = c("2000", "2000", "2000", "2002", "2000", "2002", "2007")
id = c("X", "X", "X", "X", "Z", "Z", "Z")
product = c("apple", "orange", "orange", "orange", "cake", "cake", "bacon")
market = c("CHN", "USA", "USA", "USA", "SPA", "CHL", "CHL")
df = data.frame(year, id, product, market)

我想创建 3 个变量,指示:

  1. FPFM = 如果在给定市场上第一次使用该产品,则取值 1
  2. FP = 如果是第一次使用此产品,则取值 1
  3. FM = 如果是第一次进入该市场,则取值 1:

    因此,新数据将如下所示:

    year = c("2000", "2000", "2000", "2002", "2000", "2002", "2007")
    id = c("X", "X", "X", "X", "Z", "Z", "Z")
    product = c("apple", "orange", "orange", "orange", "cake", "cake", "bacon")
    market = c("CHN", "USA", "USA", "USA", "SPA", "CHL", "CHL")
    FPFM = c(1, 1, 1, 0, 1, 1, 1)
    FP = c(1, 1, 1, 0, 1, 0, 1)
    FM = c(1, 1, 1, 0, 1, 1, 0)
    df_desired = data.frame(year, id, product, market, FPFM, FP, FM)
    

    我尝试了以下df_new没有成功的代码:

    df_new <- df %>%
      arrange(id, year) %>% 
      group_by(id, product, market) %>% 
      mutate(FPFM = row_number(year) == 1) %>% 
      as.data.frame() %>% 
      group_by(id, product) %>% 
      mutate(FP = row_number(year) == 1) %>% 
      as.data.frame() %>% 
      group_by(id, market) %>% 
      mutate(FM = row_number(year) == 1) %>% 
      as.data.frame() 
    

    它只为真正的第一次观察提供价值。我想获得第一年观察到的产品、市场或两者组合的价值。

    第 3 行应该是“TRUE;TRUE;TRUE”而不是“FALSE;FASLE;FALSE”,因为它属于同一年。

    我想到的另一个解决方案是将df按唯一值汇总3次,然后与原始df右连接。但是,这将占用大量时间和空间,因为我有大量数据。

    您有最高效的集成解决方案吗?

【问题讨论】:

    标签: r dataframe dplyr


    【解决方案1】:

    将 row_number(year) == 1 更改为 year == year[1]:

    df_new <- df %>%
      arrange(id, year) %>% 
      group_by(id, product, market) %>% 
      mutate(FPFM = year == year[1]) %>% 
      as.data.frame() %>% 
      group_by(id, product) %>% 
      mutate(FP = year == year[1]) %>% 
      as.data.frame() %>% 
      group_by(id, market) %>% 
      mutate(FM = year == year[1]) %>% 
      as.data.frame()
    

    结果:

    > df_new
      year id product market  FPFM    FP    FM
    1 2000  X   apple    CHN  TRUE  TRUE  TRUE
    2 2000  X  orange    USA  TRUE  TRUE  TRUE
    3 2000  X  orange    USA  TRUE  TRUE  TRUE
    4 2002  X  orange    USA FALSE FALSE FALSE
    5 2000  Z    cake    SPA  TRUE  TRUE  TRUE
    6 2002  Z    cake    CHL  TRUE FALSE  TRUE
    7 2007  Z   bacon    CHL  TRUE  TRUE FALSE
    

    【讨论】:

      猜你喜欢
      • 2017-11-15
      • 2016-10-21
      • 2021-12-07
      • 2022-01-23
      • 2018-04-07
      • 2017-03-23
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多