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

时间:2018-04-04 16:55:32

标签: r data.table

我有一个类似于这个的data.table:

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

我想计算col1与每个id /行的每个其他数字列(即col2,col3,col4)的绝对差值。如何使用R中的data.table或其他工具?

结果应如下所示:

+--------+-------------+-------------+-------------+------+
| "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 个答案:

答案 0 :(得分:3)

如果您不关心修改原始表,请删除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
# ...

答案 1 :(得分:0)

这是一个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

reprex package(v0.2.0)创建于2018-04-04。