基于r中两个条件的记录
recoding based on two condtions in r
我有一个示例数据集如下所示:
data <- as.data.frame(c("A","B","C","X1_theta","X2_theta","AB_theta","BC_theta","CD_theta"))
colnames(data) <- "category"
> data
category
1 A
2 B
3 C
4 X1_theta
5 X2_theta
6 AB_theta
7 BC_theta
8 CD_theta
我试图在类别(变量)中包含 "theta" 时生成逻辑变量。但是,当单元格值包含 "X1"
和 "X2"
.
时,我想将逻辑值分配为 "FALSE"
这是我所做的:
data$logic <- str_detect(data$category, "theta")
> data
category logic
1 A FALSE
2 B FALSE
3 C FALSE
4 X1_theta TRUE
5 X2_theta TRUE
6 AB_theta TRUE
7 BC_theta TRUE
8 CD_theta TRUE
这里,所有具有 "theta" 的单元格值都具有 "TRUE" 的逻辑值。
然后,我在下面写了这个,以便在单元格值中包含 "X" 时分配 "FALSE"。
data$logic <- ifelse(grepl("X", data$category), "FALSE", "TRUE")
> data
category logic
1 A TRUE
2 B TRUE
3 C TRUE
4 X1_theta FALSE
5 X2_theta FALSE
6 AB_theta TRUE
7 BC_theta TRUE
8 CD_theta TRUE
但这当然覆盖了之前的申请
我想得到的是结合两个条件:
> data
category logic
1 A FALSE
2 B FALSE
3 C FALSE
4 X1_theta FALSE
5 X2_theta FALSE
6 AB_theta TRUE
7 BC_theta TRUE
8 CD_theta TRUE
有什么想法吗?
谢谢
我们可以创建 'logic',方法是检测末尾的子字符串 'theta' 而不是 'X' ([^X]
) 作为起始 (^
) 字符
libary(dplyr)
library(stringr)
library(tidyr)
data %>%
mutate(logic = str_detect(category, "^[^X].*theta$"))
如果我们需要根据条件将列拆分成单独的列
data %>%
mutate(logic = str_detect(category, "^[^X].*theta$"),
category = case_when(logic ~ str_replace(category, "_", ","),
TRUE ~ as.character(category))) %>%
separate(category, into = c("split1", "split2"), sep= ",", remove = FALSE)
# category split1 split2 logic
#1 A A <NA> FALSE
#2 B B <NA> FALSE
#3 C C <NA> FALSE
#4 X1_theta X1_theta <NA> FALSE
#5 X2_theta X2_theta <NA> FALSE
#6 AB,theta AB theta TRUE
#7 BC,theta BC theta TRUE
#8 CD,theta CD theta TRUE
或在base R
data$logic <- with(data, grepl("^[^X].*theta$", category))
另一种选择是有两个 grepl
条件语句
data$logic <- with(data, grepl("theta$", category) & !grepl("^X\d+", category))
data$logic
#[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
不是世界上最干净的(因为它添加了 2 个不必要的列)但它完成了工作:
data <- as.data.frame(c("A","B","C","X1_theta","X2_theta","AB_theta","BC_theta","CD_theta"))
colnames(data) <- "category"
data$logic1 <- ifelse(grepl('X',data$category), FALSE, TRUE)
data$logic2 <- ifelse(grepl('theta',data$category),TRUE, FALSE)
data$logic <- ifelse((data$logic1 == TRUE & data$logic2 == TRUE), TRUE, FALSE)
print(data)
我想你也可以删除 logic1 和 logic2 cols,但我通常不会打扰(我是一个乱七八糟的编码员哈哈)。
希望对您有所帮助!
编辑:akrun 的 grepl 解决方案可以更干净地完成我正在做的事情(例如,它不需要额外的列)。我绝对推荐这种方法!
我有一个示例数据集如下所示:
data <- as.data.frame(c("A","B","C","X1_theta","X2_theta","AB_theta","BC_theta","CD_theta"))
colnames(data) <- "category"
> data
category
1 A
2 B
3 C
4 X1_theta
5 X2_theta
6 AB_theta
7 BC_theta
8 CD_theta
我试图在类别(变量)中包含 "theta" 时生成逻辑变量。但是,当单元格值包含 "X1"
和 "X2"
.
这是我所做的:
data$logic <- str_detect(data$category, "theta")
> data
category logic
1 A FALSE
2 B FALSE
3 C FALSE
4 X1_theta TRUE
5 X2_theta TRUE
6 AB_theta TRUE
7 BC_theta TRUE
8 CD_theta TRUE
这里,所有具有 "theta" 的单元格值都具有 "TRUE" 的逻辑值。
然后,我在下面写了这个,以便在单元格值中包含 "X" 时分配 "FALSE"。
data$logic <- ifelse(grepl("X", data$category), "FALSE", "TRUE")
> data
category logic
1 A TRUE
2 B TRUE
3 C TRUE
4 X1_theta FALSE
5 X2_theta FALSE
6 AB_theta TRUE
7 BC_theta TRUE
8 CD_theta TRUE
但这当然覆盖了之前的申请
我想得到的是结合两个条件:
> data
category logic
1 A FALSE
2 B FALSE
3 C FALSE
4 X1_theta FALSE
5 X2_theta FALSE
6 AB_theta TRUE
7 BC_theta TRUE
8 CD_theta TRUE
有什么想法吗? 谢谢
我们可以创建 'logic',方法是检测末尾的子字符串 'theta' 而不是 'X' ([^X]
) 作为起始 (^
) 字符
libary(dplyr)
library(stringr)
library(tidyr)
data %>%
mutate(logic = str_detect(category, "^[^X].*theta$"))
如果我们需要根据条件将列拆分成单独的列
data %>%
mutate(logic = str_detect(category, "^[^X].*theta$"),
category = case_when(logic ~ str_replace(category, "_", ","),
TRUE ~ as.character(category))) %>%
separate(category, into = c("split1", "split2"), sep= ",", remove = FALSE)
# category split1 split2 logic
#1 A A <NA> FALSE
#2 B B <NA> FALSE
#3 C C <NA> FALSE
#4 X1_theta X1_theta <NA> FALSE
#5 X2_theta X2_theta <NA> FALSE
#6 AB,theta AB theta TRUE
#7 BC,theta BC theta TRUE
#8 CD,theta CD theta TRUE
或在base R
data$logic <- with(data, grepl("^[^X].*theta$", category))
另一种选择是有两个 grepl
条件语句
data$logic <- with(data, grepl("theta$", category) & !grepl("^X\d+", category))
data$logic
#[1] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
不是世界上最干净的(因为它添加了 2 个不必要的列)但它完成了工作:
data <- as.data.frame(c("A","B","C","X1_theta","X2_theta","AB_theta","BC_theta","CD_theta"))
colnames(data) <- "category"
data$logic1 <- ifelse(grepl('X',data$category), FALSE, TRUE)
data$logic2 <- ifelse(grepl('theta',data$category),TRUE, FALSE)
data$logic <- ifelse((data$logic1 == TRUE & data$logic2 == TRUE), TRUE, FALSE)
print(data)
我想你也可以删除 logic1 和 logic2 cols,但我通常不会打扰(我是一个乱七八糟的编码员哈哈)。
希望对您有所帮助!
编辑:akrun 的 grepl 解决方案可以更干净地完成我正在做的事情(例如,它不需要额外的列)。我绝对推荐这种方法!