我即将对仿制药进行分析 - 更具体地说,我希望在药物专利到期后观察价格的发展。
我在下面的例子中提供了数据 - 列jan.2001到dec.2001代表2001年的月份 - 在每一列下,我有每日定义剂量的平均价格给定月份的仿制药。这些药物各自有一个独特的名称,由 ATC-column 中所述的ATC代码表示。
我还有一个名为 expiry 的专栏,其中列出了药品专利到期的月份。
任何人都可以告诉我,我如何计算自patent_expiry中列出的日期到每个ID的最新日期(前面提到的例子中的第12期)以来的价格差异?
以下是我当前数据的示例
> 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()
我想生成一个新的数据框,让我们称之为节省,并计算给定ATC到期月后的每个后续月份的节省。我正在考虑类似的事情:
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
A02BC01 feb.2001 NA NA -0.1 -0.1 0.1 0.1 0.1 0.1 0.2 0.1 0.0 0.0
A02BC02 jul.2001 NA NA NA NA NA NA NA 0.4 0.7 0.5 1.0 3.1
A02BC03 okt.2001 NA NA NA NA NA NA NA NA NA 0 0.9 1.3
例如:具有ATC标识符A02BC01的药物于2001年2月获得专利。现在,我想计算一下与3月3月,3月,5月,3月相比的价格差异 - 基本上是在到期月之后的每个月。
最后,我希望将每个时期的节省量与匹配期间的销售量相乘,以匹配ATC。例如,对于药物A02BC02: (Price_expiry-price_december)* salesvolume_december
最终,由于到期月后价格下降,将计算12月份销售额节省的金额。我有一个数据集,其中包含所有ATC的定义的每日dosis量和与上述数据集匹配的日期(即与之前显示的价格数据集相同的结构)。
你能帮我扩展解决方案吗?
答案 0 :(得分:1)
首先,您不应该使用数字命名列。这是一个简单的例子,通过创建一个函数。
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