【问题标题】:How to subsetting dataframes based on a condition in R如何根据 R 中的条件对数据帧进行子集化
【发布时间】:2016-02-27 12:00:14
【问题描述】:

我必须具有相同尺寸的数据框、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 中更快地完成。 我感谢任何意见

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

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

    #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-columns。我们在 melt-function 中设置模式和名称。

    #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] 
    

    关于如何运行/检查多个模型,我建议您参考this 和this 的答案。

    【讨论】:

    • 我其实想过这样的事情。但是,我的数据集非常庞大,基金名称可能会发生变化,这就是为什么我找到了用同一元素中的相应回报替换基金名称的最佳方法。我也这样做,因为我想分别通过 OLS 回归检查每个基金。
    • 对于第一部分,我不确定你的意思。一个基金可以有不同的名称吗?对于第二部分,这可以在 data.table 中完成。
    • 我的意思是,我有多个列,例如第 2 行 C 列中的基金 A 可以将其名称更改为 D 列第 2 行中的基金 B。这不会引起问题吗?我也许应该在这里告诉目标。所以我想计算每个基金的算术平均值,随着时间的推移。然后我的想法是创建每个资金的子集,然后使用 apply 函数。
    • 我可能无法正确理解这个问题,但我认为不会。我将在我的答案中添加更多解释。仍然不确定您所说的“更改”名称是什么意思; data.table 中的 melt-function 可以跨多个列处理多个度量,只要命名一致即可。
    • 我想我可能想多了。我正在尝试运行您的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2021-02-16
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多