Переименовать различные строки - PullRequest
0 голосов
/ 04 марта 2020

У меня есть набор данных, который выглядит следующим образом:

Начальный набор данных

Код, использованный для создания начального набора данных:

dataset<-data.frame(Attorney=c("John Doe", "Client #1","274", "296",
                           "297", "Client #2", "633", "Jane Doe",
                           "Client #1", "309", "323"),
                Date=c(NA, NA, "2019/4/4", "2019/4/4", "2019/4/12",
                       NA, " 2019/2/3", NA, NA, "2019/12/1", "2019/12/4"),
                Code=c(NA, NA, "7NP/7NP", "1UE/1UE", "2C1/2C1",NA,
                       "7NP/7NP", NA, NA, "7NP/7NP", "7FU/7FU"),
                Billed_Amount=c(NA, NA, 1200.00, 4000.00, 2775.00,
                               NA, 1200.00, NA, NA, 1200.00, 385),
                Amount= c(NA, NA, "1200", "4000", "2775", NA, "1200",
                          NA, NA, "1200", "385"),
                Current =c(NA, NA, 0, 0, 0, NA, 0, NA, NA, 0, 0),
                X.120=c(NA, NA, "1200", "4000", "2775", NA, "1200",
                        NA, NA, "1200", "385"))

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

Набор данных цели

Код, использованный для создания набора данных цели:

dataset<-data.frame(Attorney=c("John Doe", "John Doe", "John Doe", 
                           "John Doe", "Jane Jane", "Jane Jane"),
                Date=c("2019/4/4", "2019/4/4", "2019/12/4", " 2019/2/3",
                       "2019/12/1","2019/12/4" ),
                Code=c("7NP/7NP", "1UE/1UE","2C1/2C1", "7NP/7NP",
                       "7NP/7NP", "7FU/7FU"),
                Billed_Amount=c(1200.00, 4000.00,2775.00, 1200.00,
                                1200.00, 385),
                Amount= c(1200, 4000, 2775, 1200,1200, 385),
                Current= c(0, 0, 0, 0, 0, 0),
                X.120=c(1200, 4000, 2775,1200, 1200, 385))

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

Я пытался использовать оператор if else, но обнаружил сообщение об ошибке.

Я ценю любую помощь, которую вы можете мне оказать. Спасибо!

Редактировать: я отредактировал свой вопрос, включив в него гипотетические имена адвокатов.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Решение Base R (с использованием логики @ akrun c):

data.frame(do.call("rbind", 
                   lapply(split(dataset, cumsum(!(grepl("\\d+", dataset$Attorney)))),
                                function(x){
                                  non_att_cols <- names(x)[names(x) != "Attorney"]
                                  y <- data.frame(na.omit(x[,non_att_cols]))
                                  y$Attorney <- x$Attorney[1]
                                  return(y[,c("Attorney", non_att_cols)])
                                }
                              )
                    ),
           row.names = NULL
          )
0 голосов
/ 04 марта 2020

Можно создать группирующую переменную на основе наличия подстроки «Адвокат» в столбце «Адвокат», затем mutate столбца «Адвокат» с элементом first «Адвокат» после группировки по «grp». , filter из NA элементов

library(dplyr)
library(stringr)
dataset %>%
   group_by(grp = cumsum(str_detect(Attorney, "^Attorney"))) %>% 
   mutate(Attorney = first(Attorney)) %>% 
   filter_at(vars(Date:X.120), all_vars(!is.na(.))) %>% 
   ungroup %>% 
   select(-grp)

Мы также можем использовать na.omit здесь

dataset %>%
     group_by(grp = cumsum(str_detect(Attorney, "^Attorney"))) %>% 
     mutate(Attorney = first(Attorney)) %>%
     ungroup %>%
     select(-grp) %>%
     na.omit
# A tibble: 6 x 7
#  Attorney    Date        Code    Billed_Amount Amount Current X.120
#  <fct>       <fct>       <fct>           <dbl> <fct>    <dbl> <fct>
#1 Attorney #1 "2019/4/4"  7NP/7NP          1200 1200         0 1200 
#2 Attorney #1 "2019/4/4"  1UE/1UE          4000 4000         0 4000 
#3 Attorney #1 "2019/4/12" 2C1/2C1          2775 2775         0 2775 
#4 Attorney #1 " 2019/2/3" 7NP/7NP          1200 1200         0 1200 
#5 Attorney #2 "2019/12/1" 7NP/7NP          1200 1200         0 1200 
#6 Attorney #2 "2019/12/4" 7FU/7FU           385 385          0 385  

Или другой вариант - fill столбец «Attorney» после replace с элементами подстроки, отличными от «Attorney», с NA, так что он заполняется предыдущим не-NA элементом, затем выполните na.omit

library(tidyr)
dataset %>%
  mutate(Attorney = replace(Attorney, !str_detect(Attorney, "Attorney"), NA)) %>% 
  fill(Attorney) %>%
  na.omit
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...