Создать новый столбец в строке данных на основе частичного соответствия строки без повторов - PullRequest
2 голосов
/ 25 сентября 2019

У меня есть фрейм данных с 2 столбцами GL и GLDESC, и я хочу добавить 3-й столбец с именем KIND, основанный на некоторых данных, которые находятся внутри столбца GLDESC.

DF:

      GL                             GLDESC
1 515100                        Payroll-ISL
2 515900                        Payroll-ICA
3 532300                           Bulk Gas
4 551000                          Supply AB
5 551000                        Supply XPTO
6 551100                          Supply AB
7 551300                             Intern

Для каждой строки таблицы данных:

  • Если GLDESC содержит слово Payroll где-либо в строке, то я хочу, чтобы KIND былоPayroll.

  • Если GLDESC содержит слово Supply где-либо в строке, тогда я хочу, чтобы KIND было Supply.

  • Во всех остальных случаях я хочу, чтобы KIND было Other.

Затем я нашел это:

DF$KIND <- ifelse(grepl("supply", DF$GLDESC, ignore.case = T), "Supply", 
         ifelse(grepl("payroll", DF$GLDESC, ignore.case = T), "Payroll", "Other"))

Но с этим у меня есть все, например, Supply, классифицированное.Однако, как и в DF-строках 4 и 5, у того же GL есть два Supply, что для меня не нужно.На самом деле, мне нужно сопоставить только один тип GLDESC, если для того же самого GL строка повторяется.

Редактировать: я не могу удалить ни одну строку.Я хочу иметь это в качестве вывода:

GL  GLDESC   KIND

A   Supply1  Supply
A   Supply2  N/A
A   Supply3  N/A
A   Supply4  N/A
A   Supply5  N/A
A   Supply6  N/A
A   Payroll1 Payroll
B   Supply2  Supply
B   Payroll  Payroll

1 Ответ

1 голос
/ 25 сентября 2019

Если нам нужно, чтобы повторяющийся элемент был NA, используйте duplicated в 'GLDESC', чтобы получить логический вектор, и назначьте эти элементы в 'KIND', созданные с ifelse, на NA

* 1006.*

Если нам нужно изменить значения с помощью группирующей переменной

library(dplyr)
DF  %>%
    group_by(GL) %>%
    mutate(KIND = replace(KIND, duplicated(KIND) & KIND == "Supply", NA_character_))

# A tibble: 9 x 3
# Groups:   GL [2]
#  GL    GLDESC   KIND   
#  <chr> <chr>    <chr>  
#1 A     Supply1  Supply 
#2 A     Supply2  <NA>   
#3 A     Supply3  <NA>   
#4 A     Supply4  <NA>   
#5 A     Supply5  <NA>   
#6 A     Supply6  <NA>   
#7 A     Payroll1 Payroll
#8 B     Supply2  Supply 
#9 B     Payroll  Payroll

Или с полными изменениями

 DF1 %>%
    mutate(KIND = str_remove(GLDESC, "\\d+"), 
    KIND = replace(KIND, !KIND %in% c("Supply", "Payroll"), "Othere")) %>% 
    group_by(GL) %>% 
    mutate(KIND = replace(KIND, duplicated(KIND) & KIND == "Supply", NA_character_))

data

DF1 <- structure(list(GL = c("A", "A", "A", "A", "A", "A", "A", "B", 
"B"), GLDESC = c("Supply1", "Supply2", "Supply3", "Supply4", 
"Supply5", "Supply6", "Payroll1", "Supply2", "Payroll")), row.names = c(NA, 
-9L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...