首页 > 解决方案 > 哪个语句具有多个条件在现有列中创建新值

问题描述

我想根据某些条件使用新的附加值修改现有列。请参见下面的示例:

数据集:

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)

我想做的是根据模式、数量以及该行是否已经有值在此处应用多个条件。如果满足条件,我想填写值“信用”(见下文)

根据上述标准,这应该是输出:

("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" & FullData_Cleaned$amount < 0 & FullData_Cleaned$category_name == ""), ] <- "credit"

但是,这行代码用“credit”填充整个列,而不仅仅是空白值。

有没有人可以帮助我?

标签: r

解决方案


这就是你所追求的吗?它是dplyrbase-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="|")) & amount < 0 & 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

推荐阅读