搜索一系列列的列名字符串和 return 逻辑 (R)
Search for column name string and return logical for a series of columns (R)
示例数据:
example <- data.frame(matrix(NA, ncol=4, nrow=4))
names(example) <- c("reason_code", "d_01", "d_02", "d_03")
example$reason_code <- c("d_01, d_03", "d_01", "d_02", "d_02, d_03")
给予:
reason_code d_01 d_02 d_03
1 d_01, d_03 NA NA NA
2 d_01 NA NA NA
3 d_02 NA NA NA
4 d_02, d_03 NA NA NA
reason_code
列有时包含多个原因代码。我为每个原因代码创建了一个单独的列,并希望在 reason_code
列和 return 逻辑中搜索列名称以指示其存在,如下所示:
library(stringr)
example$d_01 <- str_detect(example$reason_code, "d_01")
捐赠:
reason_code d_01 d_02 d_03
1 d_01, d_03 TRUE NA NA
2 d_01 TRUE NA NA
3 d_02 FALSE NA NA
4 d_02, d_03 FALSE NA NA
我的真实数据有更多原因代码,因此想知道如何使用函数遍历每一列,在 reason_code
列的每一行中搜索列名在进入下一栏之前 returning TRUE
或 FALSE
?
P.s。 Whosebug A.I 告诉我。我的头衔可能会被否决或关闭,但是我不知道如何简洁准确地解释我想要的东西。我希望这个例子能说明问题。
我们可以使用 lapply
遍历列并应用 str_detect
检查字符串是否存在。
library(stringr)
example[, -1] <- lapply(names(example[, -1]), function(x) str_detect(example$reason_code, x))
example
# reason_code d_01 d_02 d_03
# 1 d_01, d_03 TRUE FALSE TRUE
# 2 d_01 TRUE FALSE FALSE
# 3 d_02 FALSE TRUE FALSE
# 4 d_02, d_03 FALSE TRUE TRUE
我们也可以只使用第一列开始。在这里,我演示了如何仅从第一列 (example2
) 创建所需的输出 (example4
)。
example2 <- example[, 1, drop = FALSE]
# reason_code
# 1 d_01, d_03
# 2 d_01
# 3 d_02
# 4 d_02, d_03
library(dplyr)
library(tidyr)
example3 <- example2 %>% mutate(ID = 1:n())
example4 <- example3 %>%
left_join(example3 %>%
separate_rows(reason_code, sep = ", ") %>%
mutate(Flag = TRUE) %>%
spread(reason_code, Flag, fill = FALSE),
by = "ID") %>%
select(-ID)
example4
# reason_code d_01 d_02 d_03
# 1 d_01, d_03 TRUE FALSE TRUE
# 2 d_01 TRUE FALSE FALSE
# 3 d_02 FALSE TRUE FALSE
# 4 d_02, d_03 FALSE TRUE TRUE
示例数据:
example <- data.frame(matrix(NA, ncol=4, nrow=4))
names(example) <- c("reason_code", "d_01", "d_02", "d_03")
example$reason_code <- c("d_01, d_03", "d_01", "d_02", "d_02, d_03")
给予:
reason_code d_01 d_02 d_03
1 d_01, d_03 NA NA NA
2 d_01 NA NA NA
3 d_02 NA NA NA
4 d_02, d_03 NA NA NA
reason_code
列有时包含多个原因代码。我为每个原因代码创建了一个单独的列,并希望在 reason_code
列和 return 逻辑中搜索列名称以指示其存在,如下所示:
library(stringr)
example$d_01 <- str_detect(example$reason_code, "d_01")
捐赠:
reason_code d_01 d_02 d_03
1 d_01, d_03 TRUE NA NA
2 d_01 TRUE NA NA
3 d_02 FALSE NA NA
4 d_02, d_03 FALSE NA NA
我的真实数据有更多原因代码,因此想知道如何使用函数遍历每一列,在 reason_code
列的每一行中搜索列名在进入下一栏之前 returning TRUE
或 FALSE
?
P.s。 Whosebug A.I 告诉我。我的头衔可能会被否决或关闭,但是我不知道如何简洁准确地解释我想要的东西。我希望这个例子能说明问题。
我们可以使用 lapply
遍历列并应用 str_detect
检查字符串是否存在。
library(stringr)
example[, -1] <- lapply(names(example[, -1]), function(x) str_detect(example$reason_code, x))
example
# reason_code d_01 d_02 d_03
# 1 d_01, d_03 TRUE FALSE TRUE
# 2 d_01 TRUE FALSE FALSE
# 3 d_02 FALSE TRUE FALSE
# 4 d_02, d_03 FALSE TRUE TRUE
我们也可以只使用第一列开始。在这里,我演示了如何仅从第一列 (example2
) 创建所需的输出 (example4
)。
example2 <- example[, 1, drop = FALSE]
# reason_code
# 1 d_01, d_03
# 2 d_01
# 3 d_02
# 4 d_02, d_03
library(dplyr)
library(tidyr)
example3 <- example2 %>% mutate(ID = 1:n())
example4 <- example3 %>%
left_join(example3 %>%
separate_rows(reason_code, sep = ", ") %>%
mutate(Flag = TRUE) %>%
spread(reason_code, Flag, fill = FALSE),
by = "ID") %>%
select(-ID)
example4
# reason_code d_01 d_02 d_03
# 1 d_01, d_03 TRUE FALSE TRUE
# 2 d_01 TRUE FALSE FALSE
# 3 d_02 FALSE TRUE FALSE
# 4 d_02, d_03 FALSE TRUE TRUE