代码之家  ›  专栏  ›  技术社区  ›  andschar Greg Snow

数字变量与许多其他变量之间的差异

  •  1
  • andschar Greg Snow  · 技术社区  · 7 年前

    我有一个数据。与此类似的表格:

    require(data.table)
    dt = as.data.table(iris[ names(iris) != 'Species' ])[1:26]
    dt[ , id := LETTERS ]
    setnames(dt, c('col1', 'col2', 'col3', 'col4', 'id'))
    

    我想计算每个id/行的col1与其他数字列(即col2、col3、col4)的绝对差值。我怎样才能用数据做到这一点。表或R中的其他工具?

    结果应如下所示:

    +--------+-------------+-------------+-------------+------+
    | "col1" | "col1_col2" | "col1_col3" | "col1_col4" | "id" |
    +--------+-------------+-------------+-------------+------+
    | 5.1    | 1.6         | 3.7         | 4.9         | "A"  |
    | 4.9    | 1.9         | 3.5         | 4.7         | "B"  |
    +--------+-------------+-------------+-------------+------+
    
    2 回复  |  直到 7 年前
        1
  •  3
  •   eddi    7 年前

    移除 copy 如果不关心修改原始表。

    cols = paste0('col', 2:4)
    # or if you want to be fancy
    cols = setdiff(names(dt)[sapply(dt, is.numeric)], 'col1')
    
    copy(dt)[, (cols) := col1 - .SD, .SDcols = cols][]
    #    col1 col2 col3 col4 id
    # 1:  5.1  1.6  3.7  4.9  A
    # 2:  4.9  1.9  3.5  4.7  B
    # 3:  4.7  1.5  3.4  4.5  C
    # ...
    
        2
  •  0
  •   Calum You    7 年前

    这是一个 dplyr 解决方案 mutate_at 允许您灵活地将一个函数应用于多个列,并且可以在以后重命名这些列。

    library(tidyverse)
    tbl <- iris %>%
      select(-Species) %>%
      slice(1:26) %>% 
      mutate(id = LETTERS) %>%
      `colnames<-`(c("col1", "col2", "col3", "col4", "id"))
    
    tbl %>%
      mutate_at(vars(col2:col4), funs(abs(col1 - .))) %>%
      rename_at(vars(col2:col4), ~ str_c("col1_", .))
    #> # A tibble: 26 x 5
    #>     col1 col1_col2 col1_col3 col1_col4 id   
    #>    <dbl>     <dbl>     <dbl>     <dbl> <chr>
    #>  1  5.10      1.60      3.70      4.90 A    
    #>  2  4.90      1.90      3.50      4.70 B    
    #>  3  4.70      1.50      3.40      4.50 C    
    #>  4  4.60      1.50      3.10      4.40 D    
    #>  5  5.00      1.40      3.60      4.80 E    
    #>  6  5.40      1.50      3.70      5.00 F    
    #>  7  4.60      1.20      3.20      4.30 G    
    #>  8  5.00      1.60      3.50      4.80 H    
    #>  9  4.40      1.50      3.00      4.20 I    
    #> 10  4.90      1.80      3.40      4.80 J    
    #> # ... with 16 more rows
    

    创建日期:2018年4月4日 reprex package (v0.2.0)。