【问题标题】:Calculate percent change between multiple columns of a data frame计算数据框多列之间的百分比变化
【发布时间】:2021-07-28 15:33:03
【问题描述】:

我有一个如下的数据框:

id <- c(1, 2, 3, 4, 5)
week1 <- c(234,567456, 134123, 13412421, 2345245)
week2 <- c(4234,5123456, 454123, 12342421, 8394545)
week3 <- c(1234, 234124, 12348, 9348522, 134534)
data <- data.frame(id, week1, week2, week3)

我想找到第 1 周和第 2 周之间的百分比变化,然后是第 2 周和第 3 周等(我的数据框要大得多,大约有 27 列)。

我试过了:

data$change1 <- (data$week2-data$week1)*100/data$week1

但是,对于更大的数据集,这将是广泛的。

【问题讨论】:

  • 数学运算符在 R 中有 data.frames 的方法; (data[-(1:2)] - data[-c(1, ncol(data))]) * 100 / data[-c(1, ncol(data))]
  • 当我在更大的数据集上尝试此操作时,我收到一条错误消息,指出 Error in Ops.data.frame(table_names[-(1:7)], table_names[-c(1, 27)]) : ‘-’ only defined for equally-sized data frames 关于为什么会发生这种情况的任何建议?我的 df 是 12714 行乘 27 列
  • 我正在尝试查找从第 7 列到第 27 列(结束)的百分比变化
  • 在您的第一个子集 (table_names[-(1:7)]) 中,您删除所有非数据列 (1:6) 和第一个数据列 (7)。在第二个子集 (table_names[-c(1, 27)]) 中,您只删除第一列和最后一列。因此,这两个子集具有不同的列数,因此(信息性)消息:“- 仅为相同大小的数据帧定义”。您需要调整第二个子集,以便删除最后一列和 all 非数据列。我把它留给你。干杯
  • @JaneMiller 如果下面的答案有帮助,请接受答案,这样它就不会再显示为未回答,如果您认为它有帮助,您甚至可以投票。如果它没有回答您的查询,请随时解释剩余的问题。您可能希望对您提出的任何其他已回答的问题执行相同的操作。

标签: r function dplyr difference


【解决方案1】:

尝试以下方法:

library(tidyverse)

df <- gather(df, key='week', value='value', -id)

df$week <- as.integer(as.character((gsub('week', '', df$week))))
df %>% group_by(id) %>% arrange(week) %>% mutate(perc_change = (value-lag(value,1))/lag(value,1)*100)
# A tibble: 15 x 4
# Groups:   id [5]
      id  week    value perc_change
   <dbl> <int>    <dbl>       <dbl>
 1     1     1      234       NA   
 2     2     1   567456       NA   
 3     3     1   134123       NA   
 4     4     1 13412421       NA   
 5     5     1  2345245       NA   
 6     1     2     4234     1709.  
 7     2     2  5123456      803.  
 8     3     2   454123      239.  
 9     4     2 12342421       -7.98
10     5     2  8394545      258.  
11     1     3     1234      -70.9 
12     2     3   234124      -95.4 
13     3     3    12348      -97.3 
14     4     3  9348522      -24.3 
15     5     3   134534      -98.4 

这工作得相当好,但假设每周都有一次观察,否则您的百分比变化将基于最后一周的可用时间(因此,如果缺少第 3 周,则第 4 周的值将是一周以第 2 周为基础的周变化)。

(编辑:将substr替换为gsub)

感觉检查:

对于第 6 行,您会看到 id 1。这是第 2 周,值为 4234。在第 1 周,id 1 的值为 234。区别是

(4234-234)/234
[1] 17.09402

所以,这是对齐的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多