从dplyr使用mutate_each函数时选择特定列

Mr_*_*r_J 5 r dplyr

我有数据框,第一列作为分类标识符,第二列作为频率值,其余列作为原始数据计数.我想将所有计数列乘以频率列而不是前两列.

所有原始计数列都以大写字母开头,然后是句号,例如"L.abd",T.xyz等.

例如,如果我使用代码:

    require(dplyr)
    ID <- c(1,2,3,4,5,6)
    Freq <- c(0.1,0.2,0.3,0.5,0.1,0.3)
    L.abc <- c(1,1,1,3,1,0)
    L.ABC <- c(0,3,2,4,1,1)
    T.xyz <- c(1,1,1,1,0,1)
    F.ABC <- c(4,5,6,5,3,1)

    df <- as.data.frame(cbind(ID, Freq, L.abc, L.ABC, T.xyz, F.ABC))

    df_new <- df %>% mutate_each(funs(.*Freq), starts_with("L."))        
Run Code Online (Sandbox Code Playgroud)

我可以创建一个包含分类数据列的新数据框以及以"L"开头的列.已乘以相应的频率值.

有没有办法更改"starts_with"命令以选择以大写字母和句号开头的所有列?我尝试使用诸如"[AZ]"之类的修改来约会.没有成功.

提前致谢

akr*_*run 7

对于这些情况,matches会更合适

  df %>%
      mutate_each(funs(.*Freq), matches("^[A-Z]\\.", ignore.case=FALSE)) 
Run Code Online (Sandbox Code Playgroud)

在这里,我假设您select只想要以大写字母(^[A-Z])后跟a 开头的列名..我们必须逃避.(\\.),否则它将被视为任何单个字符.

除了starts_with部分,我没有改变任何东西.在mutate_each如果我们需要传递一个功能,它可以在内部通过funs电话.在上面的代码中,我们将每个由('Freq'列.)选择的列()相乘matches.

根据 ?select

'matches(x,ignore.case = TRUE)':选择名称与正则表达式'x'匹配的所有变量

编辑:添加@docendodiscimus评论

  • 您可能希望使用`matches("^ [AZ] \\.",ignore.case = FALSE)`因为它默认为TRUE而OP想要匹配大写字母.比较例如`select(iris,matches("^ [az].*"))`和`select(iris,matches("^ [az].*",ignore.case = FALSE))` (2认同)