我必须使用相同尺寸的数据框,returns.df和funds.df:
returns1 <- c(0.1,0.2,0.5,0.9)
returns2 <- c(0.3,0.4,0.7,0.1)
returns.df <- data.frame(returns1,returns2)
returns.df
funds1 <- c("Fund A","Fund B","","Fund D")
funds2 <- c("Fund B","Fund C","","Fund A")
funds.df <- data.frame(funds1, funds2)
funds.df
我正在尝试为每个基金存储4个回报子集。例如,基金A的子基金回报看起来像:
returns.FundA1 <- c(0.1,"","","")
returns.FundA2 <- c("","","",0.11)
returns.FundA.df <- data.frame(returns.FundA1, returns.FundA2)
returns.FundA.df
基本上我想创建一个新的data.frame,我只需将其在fund.df中的基金名称分别替换为returns.df中的返回值,但是在新的data.frame中。 通常我会使用简单的if函数在excel中跨多个工作表执行此操作。但我相信这可以在R中更快地完成。 我感谢任何投入
答案 0 :(得分:0)
这是个人偏好,但我会将数据重新整形为长格式,其中所有内容都包含在同一个对象中。然后,子集化(或为每个基金执行操作)很容易。如果你为每个基金做同样的事情,那么为每个基金创建一个单独的数据框是不必要的,这将是很多工作。
#create ID based on row number/name
#returns.df$id <- rownames(returns.df)
#funds.df$id <- rownames(funds.df)
returns.df$id <- 1:nrow(returns.df)
funds.df$id <- 1:nrow(funds.df)
#combine them (based on these IDs)
return.funds <- merge(returns.df, funds.df, by="id")
然后,我们将这个组合的“广泛”数据集转换为长格式。由于我们有两个不同的变量(回报和基金,都有第一个和第二个值),我们使用data.table,因为它的融合函数能够处理多个measure
- 列。我们在融合函数中设置模式和名称。
#turn to long
library(data.table)
return.funds.m <- melt(setDT(return.funds),
measure.vars=patterns(c("returns","funds")),
value.name=c("return","fund"))
现在我们的数据如下:
id variable return fund
1: 1 1 0.1 Fund A
2: 2 1 0.2 Fund B
3: 3 1 0.5
4: 4 1 0.9 Fund D
5: 1 2 0.3 Fund B
6: 2 2 0.4 Fund C
7: 3 2 0.7
8: 4 2 0.1 Fund A
#example: select fund A
假设我们希望获得每个基金的两个时间点的平均回报,我们可以这样做:
return.funds.m[,mean(returns), by=fund]