减去数据帧(或矩阵)中的列

问题描述 投票:0回答:2

我试图在Excel中做更少的事情,而在R中做更多的事情,但是陷入了简单的计算中。我有一个数周内具有仪表读数的数据框。我需要计算每周的消费量,即从上一列中减去一列。例如,在下面的示例中,我需要从Reading1中减去Reading2,并从Reading2中减去Reading3。我的实际数据集包含数百个读数,因此我需要找到一种简便的方法来进行此操作。

SerialNo = c(1,2,3,4,5)
Reading1 = c(100, 102, 119, 99, 200)
Reading2 = c(102, 105, 120, 115, 207)
Reading3 = c(107, 109, 129, 118, 209)
df <- data.frame(SerialNo, Reading1, Reading2, Reading3)
df
  SerialNo Reading1 Reading2 Reading3
1      1        100      102      107
2      2        102      105      109
3      3        119      120      129
4      4         99      115      118
5      5        200      207      209

r dataframe matrix subtraction
2个回答
1
投票

这是一个整洁的解决方案,它返回格式相似的数据帧。它将数据转换为长格式(pivot_longer),应用lag函数,进行减法,然后再扩展回原始格式(pivot_wider)。

library(dplyr)
library(tidyr)

df %>%
  pivot_longer(Reading1:Reading3,
               names_to = "reading",
               names_prefix = "Reading",
               values_to = "value") %>%
  group_by(SerialNo) %>%
  mutate(offset = lag(value, 1),
         measure = value - offset) %>%
  select(SerialNo, reading, measure) %>%
  pivot_wider(names_from = reading,
              values_from = measure,
              names_prefix = "Reading")

>
# A tibble: 5 x 4
# Groups:   SerialNo [5]
  SerialNo Reading1 Reading2 Reading3
     <dbl>    <dbl>    <dbl>    <dbl>
1        1       NA        2        5
2        2       NA        3        4
3        3       NA        1        9
4        4       NA       16        3
5        5       NA        7        2

1
投票
df[,paste0(names(df)[3:4], names(df)[2:3])] <- df[,names(df)[3:4]] - df[,names(df)[2:3]] 
df
  SerialNo Reading1 Reading2 Reading3 Reading2Reading1 Reading3Reading2
1        1      100      102      107                2                5
2        2      102      105      109                3                4
3        3      119      120      129                1                9
4        4       99      115      118               16                3
5        5      200      207      209                7                2

PS:我假设列按顺序排列为1、2、3等。>

© www.soinside.com 2019 - 2024. All rights reserved.