如何解决根据列名称的向量缩放列
set.seed(123)
dat <-
data.frame(year_ref = 2000:2004,www_val1 = sample(5),www_val2 = sample(5),www_val3 = sample(5),sat_val1 = sample(5),sat_val2 = sample(5),sat_val3 = sample(5),ds_val1 = sample(5),ds_val2 = sample(5),ds_val3 = sample(5))
我想缩放其名称在另一个向量中提供的所有列。例如。向量var_names
具有ds
和sat
,我想缩放所有名称以它们开头的列
var_names <- c("ds","sat")
library(dplyr)
dat %>%
dplyr::select(contains(var_names)) %>%
dplyr::mutate(scale(.,center = T,scale = T))
但是,这正在创建新列。我可以实施以下解决方案以便进行更改吗? 仅在原始数据帧中,除了我不想对列索引进行硬编码
dat[,5:10] <- apply(dat[,5:10],2,function(x) scale(x,scale = T))
解决方法
在dplyr
版本> = 1.0.0中,您可以使用函数across
将函数应用于所有满足特定条件的列
library(dplyr)
dat %>%
mutate(across(starts_with(var_names),scale))
# year_ref www_val1 www_val2 www_val3 sat_val1 sat_val2 sat_val3 ds_val1 ds_val2 ds_val3
# 1 2000 3 3 2 -1.2649111 0.0000000 -1.2649111 -1.2649111 -0.6324555 -0.6324555
# 2 2001 2 1 3 0.6324555 0.6324555 -0.6324555 0.0000000 -1.2649111 0.0000000
# 3 2002 5 2 1 1.2649111 -0.6324555 0.0000000 0.6324555 0.0000000 0.6324555
# 4 2003 4 5 4 0.0000000 -1.2649111 0.6324555 1.2649111 0.6324555 1.2649111
# 5 2004 1 4 5 -0.6324555 1.2649111 1.2649111 -0.6324555 1.2649111 -1.2649111
,
library(tidyverse)
set.seed(123)
dat <-
data.frame(year_ref = 2000:2004,www_val1 = sample(5),www_val2 = sample(5),www_val3 = sample(5),sat_val1 = sample(5),sat_val2 = sample(5),sat_val3 = sample(5),ds_val1 = sample(5),ds_val2 = sample(5),ds_val3 = sample(5))
var_names <- c("ds","sat")
dat %>%
dplyr::mutate_at(vars(starts_with(var_names)),~scale(.,center = T,scale = T))
# year_ref www_val1 www_val2 www_val3 sat_val1 sat_val2 sat_val3 ds_val1 ds_val2 ds_val3
# 1 2000 3 3 1 0.0000000 -0.6324555 -1.2649111 0.6324555 0.6324555 0.0000000
# 2 2001 5 5 3 -1.2649111 0.0000000 0.0000000 -0.6324555 -1.2649111 1.2649111
# 3 2002 2 2 2 0.6324555 0.6324555 0.6324555 0.0000000 1.2649111 -0.6324555
# 4 2003 4 4 5 -0.6324555 -1.2649111 -0.6324555 1.2649111 -0.6324555 -1.2649111
# 5 2004 1 1 4 1.2649111 1.2649111 1.2649111 -1.2649111 0.0000000 0.6324555
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。