使用另一个条件创建(变异)列

create(mutate) column with a condition of another one

我有这个数据

     COL
    AABC1
   AAAABD2
  AAAAAABF3

我想做一个这样的栏目:

     COL         NEW_COL
    AABC1          T1
   AAAABD2         T2
  AAAAAABF3        T3

如果 COL 包含 'BC',NEW_COL 将是 T1

包含'BD',就是T2

包含'BF',将是T3。

我想使用 mutate 和 grepl 函数,但我有 80 个条件(如 BC>T1),因此代码在 R 中不起作用。

与table一样:

    CLASS       NEW_COL
    BC          T1
    BD          T2
    BF          T3

我可以使用高于标准 table 的变异(创建)新列吗??

您可以使用您的 80 个条件创建一个查找 table 并编写一个小函数来匹配它。这是一个示例(我猜通常情况下,您会从文件中读取 lookup_table):

library(tidyverse)

lookup_table <- data.frame(
                    row.names = c('BC', 'BD', 'BF'), 
                    new_col = c('T1', 'T2', 'T3'), 
                    stringsAsFactors = FALSE)

lookup <- function(x, table) {
    for (class in rownames(table)) {
        if (grepl(class, x)) {
            return(table[class, 'new_col'])
        }
    }
}

data_frame(col = c('AABC1', 'AAAABD2', 'AAAAAABF3')) %>% 
    rowwise %>% mutate(new_col = lookup(col, lookup_table))

请注意,这将采用它找到的第一个匹配项,因此请确保您的查找 table 根据您要赋予匹配规则的优先级正确排序。

这是您的数据:

DF <- data.frame(COL = c("AABC1",
                         "AAAABD2",
                         "AAAAABF3"), 
                 stringsAsFactors = FALSE)

lookup_tbl <- data.frame(CLASS = c("BC", "BD", "BF"),
                         NEW_COL = c("T1", "T2", "T3"), 
                         stringsAsFactors = FALSE)

经过一些初步准备后,您的问题已通过连接解决。

要准备 DF,您需要添加一个列,从 DF 中的 COL 中提取 table 中 CLASS 的任何实例。然后就可以正常加入了。在 R:

library(dplyr)
DF %>%
  mutate(CLASS = gsub(paste0("^.*(", 
                            paste0(lookup_tbl[["CLASS"]], collapse = "|"),
                            ").*$"), 
                      "\1",
                      lookup_tbl[["CLASS"]])) %>%
  # or inner_join as required
  left_join(lookup_tbl, by = "CLASS")

需要指定解决方案 COLCLASS 中的零个或多个实例匹配的方式。以上处理了这两种情况,但可能不是您想要的方式。