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