Создайте новый столбец на основе условия из предыдущих n строк в R - PullRequest
0 голосов
/ 09 июля 2019

Я получил данные в CSV.из отчета, полученного от Salesforce.Каждая строка представляет транзакцию и человека, который работал над транзакцией.Во многих случаях в одной и той же транзакции работало более 1 человека, поэтому в этих случаях встречаются повторяющиеся строки, в которых указываются дата, отметка времени, местоположение, офис и т. Д. , за исключением имени человека.

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

Это то, чтоданные выглядят так:

Trans_ID | Name
================
1        | Dom Toretto
2        | Brian Oconnor
3        | Letty Garcia
3        | Mia Toretto
4        | Brian Oconnor
4        | Dom Toretto
4        | Letty Garcia
4        | Jesse

Это то, что я хочу:

Trans_ID | Name          | Name2        | Name3        | Name4
===============================================================
1        | Dom Toretto   | Letty Garcia |              |
2        | Brian Oconnor |              |              |
3        | Letty Garcia  | Mia Toretto  |              |
4        | Brian Oconnor | Dom Toretto  | Letty Garcia | Jesse

Я хочу сделать это в R, но если это проще в SQL или Excel, это будет работать тоже.

Спасибо!

РЕДАКТИРОВАТЬ Поэтому я попытался использовать case when и lag in r, но теперь у меня возникла новая проблема удаления строк, которые не являютсядольше необходимо.Это также может быть неправильный подход.Есть идеи?

df<- data.frame(trans_id = c(1,2,3,3,4,4,4,4), 
Name = c("Dom Toretto","Brian Oconnor","Letty Garcia","Mia Toretto","Brian Oconnor","Dom Toretto","Letty Garcia","Jesse"))


df %>%
  mutate(
  Name2 =  case_when(
      trans_id == lag(trans_id) ~ lag(Name)
),
  Name3 = case_when(
  trans_id == lag(trans_id, 2) ~ lag(Name, 2)
),
  Name4 = case_when(
  trans_id == lag(trans_id, 3) ~ lag(Name, 3)
))

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Это будет работать с nest и map функциями, df:

df <- tibble(Trans_ID = c(1,2,3,3,4,4,4,4), 
             Name = c("Dom Toretto", "Brian Oconnor", "Letty Garcia", 
                      "Mia Toretto", "Brian Oconnor", "Dom Toretto", 
                      "Letty Garcia", "Jesse"))

Затем вложите в Trans ID и отобразите каждый кадр данных:

 df %>% 
  nest(-Trans_ID) %>% 
  mutate(
    data = map(data, ~ mutate(.x, 
                              col_name = str_c("Name", row_number())) %>% 
                 spread("col_name", "Name"))
  ) %>% 
  unnest()

Возвращает:

  Trans_ID Name1         Name2       Name3        Name4
     <dbl> <chr>         <chr>       <chr>        <chr>
1        1 Dom Toretto   NA          NA           NA   
2        2 Brian Oconnor NA          NA           NA   
3        3 Letty Garcia  Mia Toretto NA           NA   
4        4 Brian Oconnor Dom Toretto Letty Garcia Jesse

Надеюсь, это поможет!

0 голосов
/ 10 июля 2019

У вас есть ситуация, когда каждая строка имеет разное количество записей. Это говорит мне о том, что, скорее всего, вы не хотите хранить эти данные в кадре данных или в матрице-подобном объекте. Эти объекты в основном для квадратных данных, а ваши нет. Я не знаю ваш вариант использования, но я бы, вероятно, сохранил эти данные в списке символьных векторов. Вы можете получить это используя split()

output <- split(df$Name,df$Trans_ID)

Если у вас есть причина хранить это в квадратном объекте данных с пропущенными значениями, есть много способов преобразовать вышеупомянутое. Например, используя таблицу данных.

library(data.table)
squareoutput <- rbindlist(lapply(output,function(x)data.table(x)),fill=TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...