【问题标题】:Percent calculation with matching dates over a list-data frame class列表数据框类上匹配日期的百分比计算
【发布时间】:2012-10-18 05:17:43
【问题描述】:

我有我的列表MF,其中包含105 列表。每个列表,MF[[1]] MF[[2]] .... MF[[105]] 包含不同数量的数据帧。因此,MF[[1]][[1]] 存在,但MF[[1]][[2]]NULL,因为MF[[1]] 只有一个数据帧。另一方面,MF[[2]] 包含 15 个不同的数据帧,因此存在 MF[[2]][[1]]MF[[2]][[15]]

每105个列表中所有数据帧的colnames为:

[1] "Run"             "Fecha"           "Serie"           "Patrimonio"      "Ret Log Pat"     "Percentil 5%"    "Percentil Monto"

我会用一个具体的例子来问我的问题。让我们使用包含 15 个不同数据帧的 MF[[2]]。以下是这些数据帧的一些标头:

head(MF[[2]][[1]]):
 Run      Fecha Serie Patrimonio  Ret Log Pat Percentil 5% Percentil Monto
31 8011 2002-08-18     1 4191689227 -0.456258862   -0.1973659      1305605031
32 8011 2002-08-19     1 4749171865  0.124866449   -0.2179453       913558775
33 8011 2002-08-20     1 5132656241  0.077653052   -0.2179453      1035059470
34 8011 2002-08-21     1 5088469783 -0.008646158   -0.2179453      1118638070
35 8011 2002-08-22     1 4998945148 -0.017750234   -0.2179453      1109007841
36 8011 2002-08-23     1 5449454077  0.086288515   -0.2179453      1089496372

head(MF[[2]][[2]])
    Run      Fecha Serie Patrimonio   Ret Log Pat Percentil 5% Percentil Monto
31 8011 2006-05-09   100 6413583009 -0.0076314490  -0.07046562       455399234
32 8011 2006-05-10   100 6412446421 -0.0001772315  -0.07046562       451937105
33 8011 2006-05-11   100 6380254435 -0.0050328784  -0.07046562       451857014
34 8011 2006-05-12   100 6381112038  0.0001344061  -0.07046562       449588586
35 8011 2006-05-13   100 6381970402  0.0001345073  -0.07046562       449649018
36 8011 2006-05-14   100 6315827940 -0.0104180360  -0.07046562       449709503

head(MF[[2]][[3]])
    Run      Fecha Serie Patrimonio   Ret Log Pat Percentil 5% Percentil Monto
31 8011 2002-08-18     2 3147993667 -0.0395416467  -0.03216529       105340167
32 8011 2002-08-19     2 3065335420 -0.0266083198  -0.03778848       118957901
33 8011 2002-08-20     2 3044946268 -0.0066737439  -0.03778848       115834372
34 8011 2002-08-21     2 3089802537  0.0146239300  -0.03778848       115063897
35 8011 2002-08-22     2 3090714960  0.0002952578  -0.03778848       116758947
36 8011 2002-08-23     2 3230667973  0.0442864759  -0.03778848       116793426

我想要的是一个迭代或其他匹配列"Fecha"(顺便说一下,这意味着"Date"),如果日期匹配,则计算代表"Patrimonio"列每一行的百分比日期匹配的"Patrimonio" 的总和。

给出的例子:

在这种情况下,我们得到:

head(MF[[2]][[1]]):
     Run      Fecha Serie Patrimonio  Ret Log Pat Percentil 5% Percentil Monto
    31 8011 2002-08-18     1 4191689227 -0.456258862   -0.1973659      1305605031

 head(MF[[2]][[3]])
        Run      Fecha Serie Patrimonio   Ret Log Pat Percentil 5% Percentil Monto
    31 8011 2002-08-18     2 3147993667 -0.0395416467  -0.03216529       105340167

所以,MF[[2]][[1]][1,2]==MF[[2]][[3]][1,2](日期匹配),然后我希望在每个数据框上都有一个新列,如下所示:

  New column for MF[[2]][[1]] = MF[[2]][[1]][1,4]/(MF[[2]][[1]][1,4]+MF[[2]][[3]][1,4]) =  4191689227/( 4191689227+ 3147993667) ( Percent Calculation over "Patrimonio" column )

 New column for MF[[2]][[3]] = MF[[2]][[3]][1,4]/(MF[[2]][[1]][1,4]+MF[[2]][[3]][1,4]) =  3147993667/( 4191689227+ 3147993667) ( Percent Calculation over "Patrimonio" column )

问题是我必须匹配所有 15 个数据框,以通过变量 "Fecha" 计算所有 105 个列表的 "Patrimonio" 百分比,依此类推。希望我的疑问足够清楚。

【问题讨论】:

  • 我终于用dlply(MF[[i]],"Fecha") 来得到一个按日期排序的列表,这样可以很容易地工作。但是您的回答确实有助于提出这个想法。谢谢

标签: r list date dataframe match


【解决方案1】:

由于标题中的“5%”,我无法轻松使用您的数据。但是,第一步需要使用apply 系列。

lapply(MF, yourfunction)

yourfunction 应用于ML 的每个元素。由于ML 的每个元素也是一个列表,您可以再次申请(在yourfunctionlapply(MF, lapply, yourfunction) 中。

yourfunction 将可以在单个data.frame 上进行您想要的计算。我发现从这些嵌套结构中提取一个并编写一个适用于它的函数是最容易的。然后担心将其应用于嵌套列表的所有成员。

听起来您想比较 data.frames 之间的日期。如果是这种情况,最好的办法是将它们组合成一个框架,而不是嵌套在一个列表中。

您可以通过多种方式做到这一点,但我喜欢plyr

library(plyr)
ldply(unlist(MF, recursive=FALSE), as.data.frame)

那么比较就更直接了。

【讨论】:

  • +1 我同意,扁平化数据将是一个很好的起点。我也用它来解决他的问题。
【解决方案2】:

我喜欢 plyr 来解决此类问题,但我不确定我是否了解您想要什么。你能用你的数据试试这个吗?我相信 tmp5,是你想要达到的目标。

dat <- ldply(lapply(MF,ldply)) # Flatten
tmp4 <- ddply(dat,.(.id,Fecha),summarize,Percent=Patrimonio) # Pull-out
tmp5 <- na.omit(ddply(tmp4,.(.id,Fecha),summarize,New=Patrimonio[1]/(Patrimonio[1] + Patrimonio[2]))) # Calculate, when you do this do you get what you expect?


# Dummy data
 MF <- list() 
    tmp <- data.frame(Fecha=letters[1:10],Patrimonio=rnorm(10))
    tmp2 <- data.frame(Fecha=letters[1:10],Patrimonio=rnorm(10))
    MF$a <- list(tmp,tmp2)
    MF$b <- list(tmp,tmp2)

【讨论】:

  • 我没有完全理解你的代码,但我明白了。谢谢!
猜你喜欢
  • 2019-08-18
  • 2012-04-05
  • 1970-01-01
  • 2019-10-30
  • 2017-10-13
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多