我有一个类似于这个的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" |
+--------+-------------+-------------+-------------+------+
答案 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。