如何根据 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答案。
我必须使用相同尺寸的数据框,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多个模型,请参考