Существует ли функция R для поиска номера экземпляра, в котором появился элемент в списке на основании определенных условий? - PullRequest
1 голос
/ 14 апреля 2020

Я пытаюсь получить правильное количество экземпляров изменения продукта и изо всех сил. Я чувствую, что это должно быть легко, но на сегодняшний день я не могу понять это, и это сводит меня с ума.

Итак, ниже у меня есть пример кода с фиктивными данными:

library(tidyverse)
library(openxlsx)
library(olapR)
library(janitor)

file_path <- "C:\\Users\\user_name\\Desktop\\R_Question.xlsx"

df_file <- read.xlsx(file_path)

df_file <- df_file %>%
  clean_names() %>%
  mutate(actual_result = if_else((lag(product_type) == product_type &
                                  lag(claim_type) == claim_type &
                                  lag(date) != date),
                                  item_count + 1,
                                  item_count)
  ) %>% 
  replace(is.na(.), 1) %>% 
  mutate(actual_result = str_c("A", actual_result))

df_file

, который выдает:

date        order     product      claim_type  item_count desired_result  actual_result
2019-12-01  QN123456  Jacket       Alteration       1         A1              A1
2019-12-07  QN123456  Jacket       Alteration       1         A2              A2
2019-12-11  QN123456  Pants        Alteration       1         A1              A1
2019-12-13  QN123456  Pants        Alteration       1         A2              A2
2019-12-18  QN123456  Pants        Alteration       1         A3              A2
2019-12-19  QN123456  Pants        Alteration       1         A4              A2

Все, кроме последнего столбца, было частью прочитанного файла, который был прочитан. Последний столбец добавляется с использованием mutate. Я пытаюсь получить фактические результаты из столбца mutate to = требуемый результат, но я все время оказываюсь в столбце «фактический результат».

Я пытался использовать purr :: map () + function а также для l oop, но я получаю тот же результат, что и столбец «actual_result».

Я также пытался использовать cumsum (item_count) вместо item_count + 1, но это не так вполне то, что я ищу, он производит:

date        order     product      claim_type  item_count desired_result  actual_result
2019-12-01  QN123456  Jacket       Alteration       1         A1              A1
2019-12-07  QN123456  Jacket       Alteration       1         A2              A2
2019-12-11  QN123456  Pants        Alteration       1         A1              A1
2019-12-13  QN123456  Pants        Alteration       1         A2              A4
2019-12-18  QN123456  Pants        Alteration       1         A3              A5
2019-12-19  QN123456  Pants        Alteration       1         A4              A6

... что довольно близко, но не то, что мне нужно

Есть идеи?

Спасибо!

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Вероятно, вам нужно назначить уникальный номер каждому product и claim_type.

library(dplyr)

df %>% 
    group_by(product, claim_type) %>% 
    mutate(actual_result = paste0('A', row_number()))


#  date       order    product claim_type item_count desired_result actual_result
#  <fct>      <fct>    <fct>   <fct>           <int> <fct>          <chr>        
#1 2019-12-01 QN123456 Jacket  Alteration          1 A1             A1           
#2 2019-12-07 QN123456 Jacket  Alteration          1 A2             A2           
#3 2019-12-11 QN123456 Pants   Alteration          1 A1             A1           
#4 2019-12-13 QN123456 Pants   Alteration          1 A2             A2           
#5 2019-12-18 QN123456 Pants   Alteration          1 A3             A3           
#6 2019-12-19 QN123456 Pants   Alteration          1 A4             A4           

данные

df <- structure(list(date = structure(1:6, .Label = c("2019-12-01", 
"2019-12-07", "2019-12-11", "2019-12-13", "2019-12-18", "2019-12-19"
), class = "factor"), order = structure(c(1L, 1L, 1L, 1L, 1L, 
1L), .Label = "QN123456", class = "factor"), product = structure(c(1L, 
1L, 2L, 2L, 2L, 2L), .Label = c("Jacket", "Pants"), class = "factor"), 
claim_type = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = "Alteration", 
class = "factor"),item_count = c(1L, 1L, 1L, 1L, 1L, 1L), 
desired_result = structure(c(1L,2L, 1L, 2L, 3L, 4L), 
.Label = c("A1", "A2", "A3", "A4"),class = "factor")),
row.names = c(NA, -6L), class = "data.frame")
0 голосов
/ 14 апреля 2020

Мы можем использовать str_c, который также вернет NA, если есть какие-либо значения NA

library(dplyr)
library(stringr)
df %>% 
   group_by(product, claim_type) %>% 
   mutate(actual_result = str_c('A', row_number()))

Или с rowid из data.table

library(data.table)
setDT(df)[, actual_result := paste0("A", rowid(product, claim_type))][]
...