使用 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 question,mutate_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
我有一个数据框,其中第一列作为分类标识符,第二列作为频率值,其余列作为原始数据计数。我想将所有计数列乘以频率列而不是前两个。
所有原始计数列均以大写字母开头,后跟句号,例如 "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 question,mutate_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