使用dplyr和正则表达式将列转换为数据框中的因子

时间:2017-06-02 21:40:54

标签: r regex dplyr

我有一个data.frame,其中包含> 100列,这些列在导入后都会格式化为数字。我想将特定列从数字转换为因子。我不想手动转换每一列,而是使用正则表达式为列名选择相关列并对其进行转换。在regexr.com的帮助下,我创建了以下表达式:\b\w{2,4}[1-9]\b。它应该选择列名称为2到4个字母的单词的所有列,以1到9之间的数字结尾。

以下是一个例子:

df<-data.frame(pre1=c(1:10), 
               em2=c(1:10), 
               foo=c(1:10))
df
   pre1 em2 foo
1     1   1   1
2     2   2   2
3     3   3   3
4     4   4   4
5     5   5   5
6     6   6   6
7     7   7   7
8     8   8   8
9     9   9   9
10   10  10  10

df %>%
select(matches("/\b\w{2,4]}[1-9]\b/"))
Error: '\w' is an unrecognized escape in character string starting ""/\b\w"

这应该选择前两列,而不是第三列。似乎\w无法识别matches。还有其他办法吗?

1 个答案:

答案 0 :(得分:6)

您可以使用dplyr::mutate_at()很好地完成所有操作,将要更改的变量定义为vars()的因子。

library(dplyr)

df <- data_frame(pre1=c(1:10), 
                 em2=c(1:10), 
                 foo=c(1:10))

df %>%
  mutate_at(vars(matches("\\b\\w{2,4}[1-9]\\b")), as.factor)

#> # A tibble: 10 x 3
#>      pre1    em2   foo
#>    <fctr> <fctr> <int>
#>  1      1      1     1
#>  2      2      2     2
#>  3      3      3     3
#>  4      4      4     4
#>  5      5      5     5
#>  6      6      6     6
#>  7      7      7     7
#>  8      8      8     8
#>  9      9      9     9
#> 10     10     10    10