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

6

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

所有的原始计数列都以大写字母开头,后跟句点,例如"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]."等修改都没有成功。
提前感谢。
2个回答

7
在这种情况下,matches 更加适合。
  df %>%
      mutate_each(funs(.*Freq), matches("^[A-Z]\\.", ignore.case=FALSE)) 

这里假设您想要仅选择以大写字母开头(^[A-Z])并跟随一个.的列名。我们必须转义.\\.),否则它将被视为任何单个字符。
starts_with部分中,我没有改变任何内容。如果我们需要传递函数,则可以在funs调用内传递函数。在上面的代码中,我们将与“Freq”列匹配的每个选定列(.)乘以“matches”的值。
根据?select

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

编辑:添加了@docendodiscimus评论

2
你可能想使用 matches("^[A-Z]\\.", ignore.case = FALSE),因为它默认为TRUE,而OP想匹配大写字母。例如,比较一下 select(iris, matches("^[a-z].*"))select(iris, matches("^[a-z].*", ignore.case = FALSE)) - talat
@docendodiscimus 谢谢,我没有检查默认情况。 - akrun

3

我刚刚回答了其他用户的相关问题mutate_each将被弃用,使用mutate_at代替。

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

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

ID 频率 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接