使用另一个条件创建(变异)列
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")
需要指定解决方案 COL
与 CLASS
中的零个或多个实例匹配的方式。以上处理了这两种情况,但可能不是您想要的方式。
我有这个数据
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")
需要指定解决方案 COL
与 CLASS
中的零个或多个实例匹配的方式。以上处理了这两种情况,但可能不是您想要的方式。