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

时间:2016-02-27 12:00:15

标签: r dataframe subset

我必须使用相同尺寸的数据框,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中更快地完成。 我感谢任何投入

1 个答案:

答案 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] 

关于如何运行/检查多个模型,我建议你thisthis回答。