我有一个数据框中的变量序列(超过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
创建一个合并变量的列,同时保留其他列。在这种情况下可能很方便。 - camille