r - 如何计算不同变量的不同列数之间的最大差异

标签 r dplyr data.table

我有一个数据框 (df),其中包含两个不同站点(AB)和不同深度(5米C.I.5m、12米C.I.12m、20米C.I.20m、28米C.I.28m和35米C.I.35m) 随着时间的推移。我在这里展示一个例子:

df<- data.frame(Datetime=c("2018-08-06 00:00:00","2018-08-06 00:00:00","2018-08-06 03:00:00","2018-08-06 03:00:00","2018-08-06 06:00:00","2018-08-06 06:00:00"),
                Site=c("A","B","A","B","A","B"),
                C.I.5m=c(0.1,0.3,0.8,0.2,0.4,0.2),
                C.I.12m=c(0.2,0.1,0.6,0.3,0.2,0.4),
                C.I.20m=c(0.1,0.3,0.7,0.4,0.4,0.2),
                C.I.28m=c(0.2,0.3,0.4,0.1,0.1,0.2),
                C.I.35m=c(0.3,0.5,0.2,0.3,0.4,0.1))
df

             Datetime Site C.I.5m C.I.12m C.I.20m C.I.28m C.I.35m
1 2018-08-06 00:00:00    A    0.1     0.2     0.1     0.2     0.3
2 2018-08-06 00:00:00    B    0.3     0.1     0.3     0.3     0.5
3 2018-08-06 03:00:00    A    0.8     0.6     0.7     0.4     0.2
4 2018-08-06 03:00:00    B    0.2     0.3     0.4     0.1     0.3
5 2018-08-06 06:00:00    A    0.4     0.2     0.4     0.1     0.4
6 2018-08-06 06:00:00    B    0.2     0.4     0.2     0.2     0.1

我想计算不同变量的深度之间(即我的数据框中的列之间)的当前强度有多大差异。我将第一个变量称为 MCICC(列中的最大电流强度变化),它是与当前强度相关的不同列的值之间的最大差异( C.I.5mC.I.12mC.I.20mC.I.28mC.I.35m)。然后,另一个名为 MCIC10m 的变量总结了 C.I.5mC.I.12m 之间的区别。然后是另一个名为 MCIC20m 的,它总结了 C.I.12mC.I.20mC.I.28m 之间的区别。最后,一个名为 MCIC30m 的变量总结了 C.I.28mC.I.35m 之间的区别。

我希望这样:

> df
             Datetime Site C.I.5m C.I.12m C.I.20m C.I.28m C.I.35m MWCICC MWCIC10 MWCIC20 MWCIC30
1 2018-08-06 00:00:00    A    0.1     0.2     0.1     0.2     0.3    0.2     0.1     0.1     0.1
2 2018-08-06 00:00:00    B    0.3     0.1     0.3     0.3     0.5    0.4     0.2     0.2     0.2
3 2018-08-06 03:00:00    A    0.8     0.6     0.7     0.4     0.2    0.6     0.2     0.3     0.2
4 2018-08-06 03:00:00    B    0.2     0.3     0.4     0.1     0.3    0.3     0.1     0.3     0.2
5 2018-08-06 06:00:00    A    0.4     0.2     0.4     0.1     0.4    0.3     0.2     0.3     0.3
6 2018-08-06 06:00:00    B    0.2     0.4     0.2     0.2     0.1    0.3     0.2     0.2     0.1

棘手的一点是每个新变量都是根据不同数量的主列计算的。 MCICC 考虑了 5 深度(五列),MCIC10 考虑了 5 米和 12 米深度(两列),MCIC20 考虑了 12 、20 米和 28 米深度(两列),MCIC30 考虑了 28 米和 35 米深度(三列)。

有谁知道如何一次性全部计算出来?

最佳答案

我们可以使用combn来计算不同列之间的两两差异

f1 <- function(data) {
     do.call(pmax, as.data.frame(abs(combn(data, 2,
             FUN =  function(x) x[, 1]- x[,2]))))
 }
MWCICC <- f1(df[-c(1:2)])
MCIC10m <- f1(df[c("C.I.5m", "C.I.12m")])     
MCIC20m <- f1(df[c("C.I.12m", "C.I.20m", "C.I.28m")]
MCIC30m <- f1(df[c("C.I.28m", "C.I.35m")]

df[c("MWCICC", "MCIC10m", "MCIC20m", "MCIC30m")] <- cbind(MWCICC, 
        MCIC10m,  MCIC20m,  MCIC30m)  

关于r - 如何计算不同变量的不同列数之间的最大差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59118713/

相关文章:

r - 如何使用常见的前置模式从字符串中提取字符?

R:计算唯一条目的累积数量

r - 如何使用 tidyverse 向 tibble 中所有组的每一列添加额外的行?

r - 如何在不单独指定列的情况下从 data.table 中过滤出任何列为 NA 的行

r - 使用 dplyr R 中的 last_col() 函数过滤数据框

r - 将缺失日期插入数据框

r - 高效的jaccard相似度DocumentTermMatrix

r - 使用 dplyr 在组之间插入虚拟多个 X 行?

r - 将 NA 移到底部

r - $mycol, [[mycol]] 和 [, mycol, with=FALSE] 寻址列之间的确切区别是什么?