R 时间序列数据-计算差异 原始问题

R 时间序列数据-计算差异 原始问题,r,time-series,R,Time Series,我将对仿制药进行分析——更具体地说,我想观察药物专利到期后价格的变化 我在下面的例子中展示了数据——2001年1月至2001年12月列为2001年的月份——在每个列下,我都有给定月份内一种仿制药的每日规定剂量的平均价格。每种药物都有自己独特的名称,由ATC栏下的ATC代码表示 我还有一个专栏名为Expire,它指出了药物专利过期的月份 有人能告诉我,我如何计算每个ID从专利_中列出的日期到最晚日期(前面提到的示例中的第12个期间)的价格差异 更新的问题(包括Veera的解决方案): 下面是我当前

我将对仿制药进行分析——更具体地说,我想观察药物专利到期后价格的变化

我在下面的例子中展示了数据——2001年1月至2001年12月列为2001年的月份——在每个列下,我都有给定月份内一种仿制药的每日规定剂量的平均价格。每种药物都有自己独特的名称,由ATC栏下的ATC代码表示

我还有一个专栏名为Expire,它指出了药物专利过期的月份

有人能告诉我,我如何计算每个ID从专利_中列出的日期到最晚日期(前面提到的示例中的第12个期间)的价格差异

更新的问题(包括Veera的解决方案): 下面是我当前数据的一个示例

> head(dfm)
   ATC     expiry     jan.2001 feb.2001 mar.2001 apr.2001 maj.2001 jun.2001 jul.2001 aug.2001 sep.2001 okt.2001 nov.2001 dec.2001  res
1 A02BC01  feb.2001     11.9     11.9     12.0     12.0     11.8     11.9     11.9     11.9     11.8     12.0     11.9     11.9  0.0
2 A02BC02  jul.2001     11.8     10.9     11.1     11.3     11.2     11.0     11.5     11.1     10.8     11.0     10.5      8.4 -3.1
3 A02BC03  okt.2001      9.3      8.9      8.8      8.8      8.8      8.7      8.7      8.7      8.7      8.7      7.8      7.4 -1.3
4 A02BC05  nov.2001     10.6     10.4     10.6     10.6     10.5     10.5     10.4     10.4     10.6     10.5     10.4     10.4  0.0
5 A03FA03  nov.2001      5.4      4.9      5.0      4.5      4.4      4.5      4.6      4.3      4.4      4.4      4.9      5.1  0.2
最后一列“res”是我原始问题的解决方案

> str(dfm)
'data.frame':   5 obs. of  15 variables:
 $ ATC     : Factor w/ 5 levels "A02BC01 ","A02BC02 ",..: 1 2 3 4 5
 $ expiry  : chr  "feb.2001" "jul.2001" "okt.2001" "nov.2001" ...
dfm <- read.csv2("aip.csv", header = T, sep = ";", dec = ",")

dfm$expiry = as.character(dfm$expiry)

# Generate formula to calculate the savings
calc = function(){
  res = integer(nrow(dfm)) 
 for (i in 1:nrow(dfm)){ 
   res[i] = dfm[i,"dec.2001"] - dfm[i,dfm[i,"expiry"]]
 }
 return(res)
}

# Insert calculation into data frame
dfm$res = calc()
解决方案的当前代码

> str(dfm)
'data.frame':   5 obs. of  15 variables:
 $ ATC     : Factor w/ 5 levels "A02BC01 ","A02BC02 ",..: 1 2 3 4 5
 $ expiry  : chr  "feb.2001" "jul.2001" "okt.2001" "nov.2001" ...
dfm <- read.csv2("aip.csv", header = T, sep = ";", dec = ",")

dfm$expiry = as.character(dfm$expiry)

# Generate formula to calculate the savings
calc = function(){
  res = integer(nrow(dfm)) 
 for (i in 1:nrow(dfm)){ 
   res[i] = dfm[i,"dec.2001"] - dfm[i,dfm[i,"expiry"]]
 }
 return(res)
}

# Insert calculation into data frame
dfm$res = calc()
例如:ATC标识符为A02BC01的药物于2001年2月获得专利。现在,我想计算一下从那时起与3月、4月、5月、…、12月的价格差异——基本上是到期月份之后的每个月

最后,我想将每个时期的节省与匹配时期的销售量相乘,用于匹配的ATC。例如,对于药物A02BC02: (价格-价格-12月)*销售量-12月

最后,它将计算由于到期月份后价格下降而在12月份销售中节省的金额。我有一个数据集,其中包含所有ATC的规定每日剂量量和与上述数据集匹配的日期(即与前面提供的价格数据集结构相同)


你能帮我把解决方案扩展到这个吗

首先,不应该用数字命名列。下面是一个简单的示例,通过为此创建一个函数

jan = sample(1:20,5)
feb = sample(1:20,5)
mar = sample(1:20,5)
apr = sample(1:20,5)
expiry = c("jan","feb","mar","apr","jan")
dfm = data.frame(jan,feb,mar,apr,expiry)
dfm$expiry = as.character(dfm$expiry)

calc = function(){
    res = integer(nrow(dfm))
    for (i in 1:nrow(dfm)){
              res[i] = dfm[i,"apr"] - dfm[i,dfm[i,"expiry"]]
          }
    return(res)
}
dfm$res = calc()

  jan feb mar apr expiry res
1   5   4  14  12    jan   7
2  19   3  12   5    mar  -7
3   2   6   5   6    apr   0
4   9  10  15  16    feb   6
5  16   7  20  15    jan  -1

这一年不相关吗?关于月份的信息应该不够。。。此外,请给出一个可复制的例子-然后我们可以提供帮助。你能更详细地解释一下最后的节省部分吗?这里“储蓄”的定义是什么?我试着用下面的一个例子来解释——我把数字倒过来,我可以理解为什么它们在提到“储蓄”时有点混乱。再次感谢您的帮助:-)分段填充向量是不好的R,因为在每次迭代中R必须保留新空间并复制所有值。我添加了一个初始化,尽管这个问题不需要循环就可以解决。您的建议,
res=c(length=nrow(dfm))
恐怕是不对的。它不是定义向量的“长度”,它只是在向量中添加一个名为length的元素
res
你是对的,它应该是
res对不起,但它仍然是一样的,它只是添加了一个额外的元素,但没有定义向量的长度。你可以运行它,然后检查一下。从:“
integer
创建指定长度的整数向量。向量的每个元素都等于0。”