【问题标题】:Selecting specific columns when using mutate_each function from dplyr使用 dplyr 中的 mutate_each 函数时选择特定列
【发布时间】:2015-10-26 19:00:24
【问题描述】:

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

所有原始计数列都以大写字母开头,后跟句号,例如“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”命令来选择所有以大写字母和句号开头的列?我尝试使用诸如“[A-Z]”之类的修改进行约会。失败了。

提前致谢

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

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

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

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

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

    根据?select

    ‘matches(x, ignore.case = TRUE)’:选择所有符合条件的变量 名称匹配正则表达式“x”

    编辑:添加了@docendodiscimus 评论的

    【讨论】:

    • 您可能想要使用matches("^[A-Z]\\.", ignore.case = FALSE),因为它默认为 TRUE 并且 OP 想要匹配大写字母。例如比较 select(iris, matches("^[a-z].*"))select(iris, matches("^[a-z].*", ignore.case = FALSE))
    • @docendodiscimus 谢谢,没有检查默认情况。
    【解决方案2】:

    我刚刚从其他用户那里回答了a related questionmutate_each 将被mutate_at 弃用。

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

    df %&gt;% 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

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2015-01-17
      • 2013-03-02
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      相关资源
      最近更新 更多