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

Selecting specific columns when using mutate_each function from 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."))        

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

有没有办法将 "starts_with" 命令更改为 select 所有以大写字母和句号开头的列?我尝试使用诸如“[A-Z]”之类的修改来约会。没有成功。

提前致谢

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

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

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

除了 starts_with 部分,我不会更改任何内容。在mutate_each中如果我们需要传递一个函数,可以在funs调用中传递。在上面的代码中,我们将 matches 选择的每一列 (.) 与 'Freq' 列相乘。

根据?select

‘matches(x, ignore.case = TRUE)’: selects all variables whose name matches the regular expression ‘x’

编辑:添加了@docendodiscimus 评论的

我刚刚从其他用户那里回答了 a related questionmutate_each 将被弃用,取而代之的是 mutate_at

在您的情况下,等效代码是:

df %>% mutate_at(.cols=vars(matches("^[A-Z]\.", ignore.case=FALSE)), .funs=funs(.*Freq))

ID Freq L.abc L.ABC T.xyz F.ABC 1 1 0.1 0.1 0.0 0.1 0.4 2 2 0.2 0.2 0.6 0.2 1.0 3 3 0.3 0.3 0.6 0.3 1.8 4 4 0.5 1.5 2.0 0.5 2.5 5 5 0.1 0.1 0.1 0.0 0.3 6 6 0.3 0.0 0.3 0.3 0.3