如何创建R的百分比变化表?
我有一个表df,看起来像这样(有更多的列和更多的行): 我想创建一个新的表df2,其中红色框中的每个单元格都被上一个日期的值的百分比变化所取代(最上面一行显然显示NA)。例如,新表中右下角的单元格应为-.0188如何创建R的百分比变化表?,r,R,我有一个表df,看起来像这样(有更多的列和更多的行): 我想创建一个新的表df2,其中红色框中的每个单元格都被上一个日期的值的百分比变化所取代(最上面一行显然显示NA)。例如,新表中右下角的单元格应为-.0188 是否有一个函数(基本函数或某个包中的函数)可以执行此操作?如果是这样,我如何使用它?这里有一个解决方案,使用一些虚构的数据和tidyverse函数。这里的关键是dplyr::lag,它允许您引用数据帧中的前一个值。请注意,选择vars(-day)将选择除day之外的所有列,并且使用f
是否有一个函数(基本函数或某个包中的函数)可以执行此操作?如果是这样,我如何使用它?这里有一个解决方案,使用一些虚构的数据和
tidyverse
函数。这里的关键是dplyr::lag
,它允许您引用数据帧中的前一个值。请注意,选择vars(-day)
将选择除day
之外的所有列,并且使用funs(pct\u change=)
将创建新列,原始名称将放在pct\u change
前面。在funs
中,
指的是该列中的一个值,因此我们可以直接通过除以先前的值并减去1来计算比例变化
库(tidyverse)
种子集(100)
待定%
突变(
.vars=vars(-day),
.funs=funs(pct_变化=(/滞后()-1)
)
#>#A tibble:4 x 5
#>第1列第2列第1列第2列第1列第2列第2列第1列
#>
#>1 19.50 10.1不适用
#> 2 2 10.1 10.3 0.0667 0.0199
#> 3 3 9.92 9.42 -0.0208 -0.0873
#> 4 4 10.9 10.7 0.0973 0.138
由(v0.2.0)于2018年4月19日创建。这里是一个使用一些虚构数据和
tidyverse
功能的解决方案。这里的关键是dplyr::lag
,它允许您引用数据帧中的前一个值。请注意,选择vars(-day)
将选择除day
之外的所有列,并且使用funs(pct\u change=)
将创建新列,原始名称将放在pct\u change
前面。在funs
中,
指的是该列中的一个值,因此我们可以直接通过除以先前的值并减去1来计算比例变化
库(tidyverse)
种子集(100)
待定%
突变(
.vars=vars(-day),
.funs=funs(pct_变化=(/滞后()-1)
)
#>#A tibble:4 x 5
#>第1列第2列第1列第2列第1列第2列第2列第1列
#>
#>1 19.50 10.1不适用
#> 2 2 10.1 10.3 0.0667 0.0199
#> 3 3 9.92 9.42 -0.0208 -0.0873
#> 4 4 10.9 10.7 0.0973 0.138
由(v0.2.0)于2018年4月19日创建。A
数据。基于表的解决方案可以如下所示:
library(data.table)
library(lubridate)
#Convert Date column to of type Date/POSIXct and order on that column
DT[,Date:=ymd(Date)][
order(Date),c(.(Date = Date), lapply(.SD,function(x)(x/lag(x) - 1))),.SDcols=2:4]
# Date AEDUSD AUDUSD CADUSD
# 1: 2008-03-17 NA NA NA
# 2: 2008-03-18 0.0000000000 -0.021097496 -0.006626446
# 3: 2008-03-19 0.0000000000 0.009361054 0.001294305
# 4: 2008-03-20 -0.0003671072 -0.006578238 -0.009645023
# 5: 2008-03-24 0.0000000000 -0.026378637 -0.018775100
数据:
DT = data.table(Date = c("2008-03-17","2008-03-18","2008-03-19","2008-03-20","2008-03-24"),
AEDUSD = c(0.2724, 0.2724, 0.2724, 0.2723, 0.2723),
AUDUSD = c(0.9385, 0.9187, 0.9273, 0.9212, 0.8969),
CADUSD = c(1.0111, 1.0044, 1.0057, 0.9960, 0.9773))
基于数据表的解决方案可以是:
library(data.table)
library(lubridate)
#Convert Date column to of type Date/POSIXct and order on that column
DT[,Date:=ymd(Date)][
order(Date),c(.(Date = Date), lapply(.SD,function(x)(x/lag(x) - 1))),.SDcols=2:4]
# Date AEDUSD AUDUSD CADUSD
# 1: 2008-03-17 NA NA NA
# 2: 2008-03-18 0.0000000000 -0.021097496 -0.006626446
# 3: 2008-03-19 0.0000000000 0.009361054 0.001294305
# 4: 2008-03-20 -0.0003671072 -0.006578238 -0.009645023
# 5: 2008-03-24 0.0000000000 -0.026378637 -0.018775100
数据:
DT = data.table(Date = c("2008-03-17","2008-03-18","2008-03-19","2008-03-20","2008-03-24"),
AEDUSD = c(0.2724, 0.2724, 0.2724, 0.2723, 0.2723),
AUDUSD = c(0.9385, 0.9187, 0.9273, 0.9212, 0.8969),
CADUSD = c(1.0111, 1.0044, 1.0057, 0.9960, 0.9773))
请不要发布数据的图像,而是使用dput
提供一个简短的示例。请参见请不要发布数据的图像,而是使用dput
提供一个简短的示例。看见