【发布时间】:2019-09-11 17:40:25
【问题描述】:
我在数据框中有一系列变量(超过 100 个),我想创建一个指示变量,用于判断任何变量中是否存在特定文本模式。下面是一个包含三个变量的示例。我发现的一种解决方案是使用tidyr::unite(),后跟dplyr::mutate(),但我对不必合并变量的解决方案感兴趣。
c1<-c("T1", "X1", "T6", "R5")
c2<-c("R4", "C6", "C7", "X3")
c3<-c("C5", "C2", "X4", "T2")
df<-data.frame(c1, c2, c3)
c1 c2 c3
1 T1 R4 C5
2 X1 C6 C2
3 T6 C7 X4
4 R5 X3 T2
code.vec<-c("T1", "T2", "T3", "T4") #Text patterns of interest
code_regex<-paste(code.vec, collapse="|")
new<-df %>%
unite(all_c, c1:c3, remove=FALSE) %>%
mutate(indicator=if_else(grepl(code_regex, all_c), 1, 0)) %>%
select(-(all_c))
c1 c2 c3 indicator
1 T1 R4 C5 1
2 X1 C6 C2 0
3 T6 C7 X4 0
4 R5 X3 T2 1
上面是一个产生预期结果的示例,但是我觉得在tidyverse 中应该有一种方法可以做到这一点,而不必联合变量。这是 SAS 使用 ARRAY 语句和 DO 循环非常容易处理的事情,我希望 R 有一个很好的方法来处理这个问题。
真正的数据框除了要搜索的“c”字段之外还有许多其他变量,因此涉及搜索每一列的解决方案需要将数据框子集为首先仅包含我想要搜索的变量,然后将数据连接回来与其他变量。
【问题讨论】:
-
您说您不想使用
unite,但值得注意的是,传递参数remove = FALSE使unite创建了一列联合变量,而其他变量保持不变。在这种情况下可能会很方便。 -
是的,很方便。它确实有效。我只是觉得我可能缺少一种更简单的方法,不需要创建统一变量。