gpt4 book ai didi

r - 为大量列分配不同的值

转载 作者:行者123 更新时间:2023-12-04 18:37:47 24 4
gpt4 key购买 nike

我有大量包含数百列的财务数据。我已经根据日期对数据进行了清理和排序。这是一个简化的示例:

df1 <- data.frame(matrix(vector(),ncol=5, nrow = 4))
colnames(df1) <- c("Date","0.4","0.3","0.2","0.1")
df1[1,] <- c("2000-01-31","0","0","0.05","0.07")
df1[2,] <- c("2000-02-29","0","0.13","0.17","0.09")
df1[3,] <- c("2000-03-31","0.03","0.09","0.21","0.01")
df1[4,] <- c("2004-04-30","0.05","0.03","0.19","0.03")
df1
Date 0.4 0.3 0.2 0.1
1 2000-01-31 0 0 0.05 0.07
2 2000-02-29 0 0.13 0.17 0.09
3 2000-03-31 0.03 0.09 0.21 0.01
4 2000-04-30 0.05 0.03 0.19 0.03

我分配了个人权重(基于原始数据的市场值(value))作为列标题,因为我不关心公司名称,我需要权重来计算结果。

我的最终目标是: 1. 加权 yield 之和; 2. yield 非零时的权重总和。话虽如此,下面是我想要得到的结果:

        Date    SWeightedR    SWeights    
1 2000-01-31 0.017 0.3
2 2000-02-29 0.082 0.6
3 2000-03-31 0.082 1
4 2000-04-30 0.07 1

例如,2000-01-31 的 SWeightedR = 0.4x0+0.3x0+0.2x0.05+0.1x0.07,SWeights = 0.2+0.1。

我最初的想法是为每列分配权重,例如 WCol2 <- 0.4 , 然后使用 cbind创建新列并使用 c(as.matrix() %*% )得到总和。很快我意识到这是不可能的,因为有数百个列。任何意见或建议表示赞赏!

最佳答案

这是一个使用矩阵乘法的简单解决方案(正如您自己建议的那样)。

首先,您的数据似乎是 character 类型,我不确定真实数据是否是真实情况,但我会先将其转换为适当的类型

df1[-1] <- lapply(df1[-1], type.convert)

接下来,我们也将列名转换为数字类

vec <- as.numeric(names(df1)[-1])

最后,我们可以通过两个简单的步骤轻松创建新列。这确实有一个到矩阵转换的开销,但也许你应该首先使用矩阵。无论哪种方式,这都是完全矢量化的

df1["SWeightedR"] <- as.matrix(df1[, -1]) %*% vec
df1["SWeights"] <- (df1[, -c(1, ncol(df1))] > 0) %*% vec
df1
# Date 0.4 0.3 0.2 0.1 SWeightedR SWeights
# 1 2000-01-31 0.00 0.00 0.05 0.07 0.017 0.3
# 2 2000-02-29 0.00 0.13 0.17 0.09 0.082 0.6
# 3 2000-03-31 0.03 0.09 0.21 0.01 0.082 1.0
# 4 2004-04-30 0.05 0.03 0.19 0.03 0.070 1.0

或者,您可以先转换为长格式(这里有一个 data.table 示例),但我相信它的效率会较低,因为这基本上是行操作

library(data.table)
res <- melt(setDT(df1), id = 1L, variable.factor = FALSE
)[, c("value", "variable") := .(as.numeric(value), as.numeric(variable))]
res[, .(SWeightedR = sum(variable * value),
SWeights = sum(variable * (value > 0))), by = Date]

# Date SWeightedR SWeights
# 1: 2000-01-31 0.017 0.3
# 2: 2000-02-29 0.082 0.6
# 3: 2000-03-31 0.082 1.0
# 4: 2004-04-30 0.070 1.0

关于r - 为大量列分配不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38837850/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com