如何根据 R 中的条件对数据帧进行子集化

How to subsetting dataframes based on a condition in R

我必须使用相同尺寸的数据框,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

我正在尝试为每个基金存储 returns 的 4 个子集。例如,基金 A 的子基金 Returns 看起来像:

returns.FundA1 <- c(0.1,"","","")
returns.FundA2 <- c("","","",0.11)
returns.FundA.df <- data.frame(returns.FundA1, returns.FundA2)
returns.FundA.df

基本上我想创建一个新的 data.frame,我只是用 returns.df 中的 returns 分别替换 fund.df 中的基金名称,但在新的 data.frame。 通常我会在 excel 中使用一个简单的 if 函数跨多个工作表执行此操作。但我相信这可以在 R 中更快地完成。 我感谢任何输入

这是个人喜好,但我会将我的数据重塑为长格式,其中所有内容都包含在同一个对象中。然后子集(或为每个基金执行操作)很容易。如果您对每个基金都做同样的事情,则没有必要为每个基金创建一个单独的数据框,而且工作量会很大。

#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")

然后,我们将这个组合的 'wide' 数据集转换为长格式。由于我们有两个不同的不同度量(return 和基金,都有第一个值和第二个值),我们使用 data.table 因为它的 melt-function 能够处理多个 measure -列。我们在 melt 函数中设置模式和名称。

#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,我们可以这样做:

return.funds.m[,mean(returns), by=fund] 

如何run/examine多个模型,请参考 and this答案。