#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()
и преобразовать коэффициент в символы