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

#r

#r

Вопрос:

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

набор данных:

 description <- c("x value", "y value", "period 01-08-2019 t/m 31-08-2019 faktnr", "x value", "this is a sentence deb nr", "x value", "also a sentence debnr", "deb nr", "y value", "y value")
category_name <- c("x", "y", "", "x", "", "x", "", "", "y", "y")
amount<- c(-100, 200, -200, 10, 50, -3, -500, 100, 1, 1)
FullData_Cleaned <- cbind(description, category_name, amount)
  

Что я хотел бы сделать, так это применить здесь несколько условий на основе шаблона, суммы и того, имеет ли строка уже значение. Если условия выполнены, я хочу заполнить значение «credit» (см. Ниже)

Основываясь на вышеупомянутых критериях, это должно быть результатом:

 ("x", "y", "credit", "x", "", "x", "credit", "", "y", "y")
  

Это мой код:

 patterns <- c("debnr", "deb nr", "deb.nr",  "fcnr", "factnr", "factno", "faktnr")

FullData_Cleaned$category_name <- FullData_Cleaned[which(FullData_Cleaned$description %in% "patterns" amp; FullData_Cleaned$amount < 0 amp; FullData_Cleaned$category_name == ""), ] <- "credit"
  

Однако эта строка кода заполняет весь столбец «credit» вместо только пустых значений.

Есть ли кто-нибудь, кто может мне помочь?

Ответ №1:

Это то, что вам было нужно? Это решение dplyr скорее в base-R. Я нахожу синтаксис более интуитивно понятным, чем base-R, и проще выполнять более сложный анализ.

Сначала вам нужно преобразовать вашу матрицу в data.frame. Затем dplyr::mutate функция заменяет существующий столбец в соответствии с логикой внутри ifelse функции, заменяя его на ‘credit’, если логика заполнена, или что-то еще в строке для category_name .

 library(dplyr)
FullData_Cleaned = as.data.frame(FullData_Cleaned)
FullData_Cleaned %>% 
    dplyr::mutate(category_name = 
        ifelse(stringr::str_detect(description, paste(patterns, collapse="|")) amp; amount < 0 amp; category_name == "", 
            "credit", 
            category_name)
        )
  
                                 description category_name amount
 1:                                 x value             x   -100
 2:                                 y value             y    200
 3: period 01-08-2019 t/m 31-08-2019 faktnr        Credit   -200
 4:                                 x value             x     10
 5:               this is a sentence deb nr                   50
 6:                                 x value             x     -3
 7:                   also a sentence debnr        Credit   -500
 8:                                  deb nr                  100
 9:                                 y value             y      1
10:                                 y value             y      1
  

Комментарии:

1. Это именно то, что я искал, большое спасибо!

2. Рад помочь и добро пожаловать в Stack Overflow. Если этот или любой другой ответ решил вашу проблему, пожалуйста, отметьте его как принятый, чтобы помочь другим пользователям в будущем.

Ответ №2:

помогает ли это? Решение Data.table. Сначала я свернул шаблоны, используя paste . Затем я использовал like функцию для сравнения description patterns . Затем преобразовал ваш df в data.table. Там вы можете выбрать только те строки, в которых выполняются условия (перед запятой), и изменить значение столбца только для этих строк (после запятой).

 library(data.table)
library(dplyr)
patterns <- paste(patterns, collapse = "|")
FullData_Cleaned <- as.data.table(FullData_Cleaned)
FullData_Cleaned[amount < 0 amp; like(vector = description, pattern = patterns, ignore.case = TRUE) == TRUE, category_name := "Credit"]
  

Вывод:

                                 description category_name amount
 1:                                 x value             x   -100
 2:                                 y value             y    200
 3: period 01-08-2019 t/m 31-08-2019 faktnr        Credit   -200
 4:                                 x value             x     10
 5:               this is a sentence deb nr                   50
 6:                                 x value             x     -3
 7:                   also a sentence debnr        Credit   -500
 8:                                  deb nr                  100
 9:                                 y value             y      1
10:                                 y value             y      1
  

Комментарии:

1. Спасибо! Это также помогает 🙂

Ответ №3:

Я предположу, что у вас есть фрейм данных. В этом случае вам нужно grepl не %in% потому, что вы не совпадаете точно, а скорее ищете шаблон в строках, т.е.

 df$category_name[(grepl(paste(patterns, collapse = '|'), df$description)) amp;
                 (df$amount < 0) amp; 
                 (df$category_name == "")] <- "credit"
  

ПРИМЕЧАНИЕ: сначала необходимо преобразовать в data.frame() и преобразовать коэффициент в символы