R - 计算每行的最大和最小列之间的差异

时间:2017-05-02 00:54:35

标签: r dataframe difference

标题非常简单 - 如何计算每行的最大值和最小值之间的差异?

我们假设这是我的数据:

a b c d
1 2 3 4
0 3 6 9
3 2 1 4
9 8 7 6

对于每一行,我想找到具有最高值的列与具有最低值的列之间的差异 - 结果如下所示:

3
9
3
3

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:6)

<强> 1

对于每一行(使用带有apply的{​​{1}}),使用MARGIN = 1获取最小值和最大值的向量,然后使用range获取这些值的差异值

diff

<强> 2

如果您想要更快速的解决方案,可以使用并行最大值和最小值(apply(X = df, MARGIN = 1, function(x) diff(range(x))) #[1] 3 9 3 3 pmax

pmin

<小时/> 数据

do.call(pmax, df) - do.call(pmin, df)
#[1] 3 9 3 3

<强>计时

df = structure(list(a = c(1L, 0L, 3L, 9L), b = c(2L, 3L, 2L, 8L), 
    c = c(3L, 6L, 1L, 7L), d = c(4L, 9L, 4L, 6L)), .Names = c("a", 
"b", "c", "d"), class = "data.frame", row.names = c(NA, -4L))

答案 1 :(得分:3)

尝试使用我最喜欢的max.col进行一些矩阵索引:

rw <- seq_len(nrow(dat))
dat[cbind(rw, max.col(dat))] - dat[cbind(rw, max.col(-dat))]
#[1] 3 9 3 3

对于大型数据集,这应该快得多,如:

# 5 million big enough?
dat <- dat[sample(1:4,5e6,replace=TRUE),]

system.time({
  rw <- seq_len(nrow(dat))
  dat[cbind(rw, max.col(dat))] - dat[cbind(rw, max.col(-dat))]
})
#   user  system elapsed 
#   2.43    0.20    2.63 

system.time({
  apply(X = dat, MARGIN = 1, function(x) diff(range(x)))
})
#   user  system elapsed 
#  94.91    0.17   95.16