我的列表 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”
百分比,依此类推。希望我的疑问足够清楚。
最佳答案
由于标题中的“5%”,我无法轻松使用您的数据。但是,第一步需要使用 apply
系列。
lapply(MF, yourfunction)
会将 yourfunction
应用于 ML
的每个元素。由于 ML
的每个元素也是一个列表,因此您可以再次 lapply(在 yourfunction
或 lapply(MF, lapply, yourfunction)
中。
yourfunction
将用于在单个 data.frame
上执行您想要的计算。我发现从这些嵌套结构中提取一个并编写一个适用于它的函数是最简单的。然后担心将其应用于嵌套列表的所有成员。
听起来您想比较 data.frames 之间的日期。如果是这种情况,最好的选择是将它们组合成一个框架,而不是嵌套在列表中。
您可以通过多种方式做到这一点,但我喜欢 plyr
。
library(plyr)
ldply(unlist(MF, recursive=FALSE), as.data.frame)
这样比较就更加直接了。
关于r - 列表数据框类上匹配日期的百分比计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12947592/