微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据列名称的向量缩放列

如何解决根据列名称的向量缩放列

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具有dssat,我想缩放所有名称以它们开头的列

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 举报,一经查实,本站将立刻删除。