这个问题在这里已有答案:
示例数据:
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
列中搜索列名并返回逻辑以指示其存在,如下所示:
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
列的每一行中搜索列名并返回TRUE
或FALSE
,然后继续下一栏?
附: stackoverflow 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
我们也可以从第一列开始。在这里,我演示如何仅从第一列(example4
)创建所需的输出(example2
)。
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