首页 文章

根据列类有条件地改变列

提问于
浏览
2

我的问题是基于此处发布的上一个主题:Mutating multiple columns in a data frame

假设我有一个如下的反复:

id   char_var_1   char_var_2   num_var_1   num_var_2  ... x_var_n
1       ...           ...         ...         ...           ...
2       ...           ...         ...         ...           ...
3       ...           ...         ...         ...           ...

其中 id 是键, char_var_x 是字符变量, num_var_x 是数字变量 . 我总共有346列,我想编写一个函数来扩展除 id 列之外的所有数值变量 . 我正在寻找一种使用管道和dplyr函数的 mutate 这些列的优雅方法 .

显然,以下适用于所有数字变量:

pre_process_data <- function(dt)
{
  # scale numeric variables
  dt %>% mutate_if(is.numeric, scale)
}

但我正在寻找一种方法从缩放中排除 id 列并保留原始值,同时缩放所有其他数值变量 . 有一种优雅的方式来做到这一点?

3 回答

  • 1

    试试下面,回答类似于select_if帖子:

    library(dplyr)
    
    # Using @Psidom's example data: https://stackoverflow.com/a/48408027
    
    df %>%
      mutate_if(function(col) is.numeric(col) &
                  !all(col == .$id), scale)
    #   id a  b
    # 1  1 a -1
    # 2  2 b  0
    # 3  3 c  1
    
  • 2

    这不是规范的方法,但有一点点破解,你可以使用 mutate_at 通过使用 which 使用手动构造的列选择条件使列的整数索引变异来实现:

    df = data.frame(id = 1:3, a = letters[1:3], b = 2:4)
    df %>% 
        mutate_at(vars(which(sapply(., is.numeric) & names(.) != 'id')), scale)
    
    #  id a  b
    #1  1 a -1
    #2  2 b  0
    #3  3 c  1
    
  • 3

    如何“让你感兴趣的一个角色,然后改变它的方法?”

    dt %>%
        mutate(id = as.character(id)) %>% 
        mutate_if(is.numeric, scale) %>% 
        mutate(id = as.numeric(id))
    

相关问题