对所有列重复一个成功的循环

Repeat a successful loop for all columns

我在 R 中遇到了问题。由于我仍在成功地学习编码,希望你能帮助我。

我有一个数据框,其中 header 定义为股票 ISIN,下面是数字格式的每日股票价格。

ISIN1 ISIN 2 ISIN3 ...
2.35 10.10 0.90 ...
2.45 9.98 0.85 ...
2.40 10.15 0.70 ...
... ... ... ...

现在我不需要 ISIN 下方各列中的股票价格,但我需要百分比变化。格式如下:

ISIN1 ISIN 2 ISIN3 ...
NA NA NA ...
0.04255 -0.01188 -0.05555 ...
-0.02041 0.01703 -0.12647 ...
... ... ... ...

我设法通过第一列 (ISIN1) 实现了这一点,但是,我无法将代码集成到其他列。我认为必须有一种简单的方法,无需手动复制和粘贴每个 ISIN 的代码。我尝试了 apply, sapply, loop, for, ... 的不同选项,但我没有找到合适的选项,或者我没有输入正确的选项。

您可以在下面找到我的第一个 ISIN 代码。正在创建的 df 被命名为“return”,我有可用股票价格的 df 被称为“stock_prices”

for (i in 2:nrow(return)) {
return$`ISIN1`[(i)] = ((stock_prices$`ISIN1`[(i)])/stock_prices$`ISIN1`[(i-1)])-1
    }

我希望你能帮助我,我已经以一种可以理解的方式提出了这个问题。 谢谢!!

在 R 中执行此操作的规范方法是 lapply,类似于:

running_change <- function(x) c(NA, diff(x) / x[-length(x)])
changes <- lapply(dat[,1:3], running_change)
changes
# $ISIN1
# [1]          NA  0.04255319 -0.02040816
# $ISIN.2
# [1]          NA -0.01188119  0.01703407
# $ISIN3
# [1]          NA -0.05555556 -0.17647059

那个returns一个list;如果你想添加到数据,那么

cbind(dat, changes)
#   ISIN1 ISIN.2 ISIN3 ...       ISIN1      ISIN.2       ISIN3
# 1  2.35  10.10  0.90 ...          NA          NA          NA
# 2  2.45   9.98  0.85 ...  0.04255319 -0.01188119 -0.05555556
# 3  2.40  10.15  0.70 ... -0.02040816  0.01703407 -0.17647059

不过,如果你想替换数据,你可以这样做

dat[1:3] <- changes
dat
#         ISIN1      ISIN.2       ISIN3 ...
# 1          NA          NA          NA ...
# 2  0.04255319 -0.01188119 -0.05555556 ...
# 3 -0.02040816  0.01703407 -0.17647059 ...

或者,在原来的步骤中,做

dat[,1:3] <- lapply(dat[,1:3], running_change)

我在这里使用 1:3 是将数据子集化为仅需要操作的列。如果所有列都是数字并且您需要对所有列进行计算,那么在您的数据中可能没有必要;在这种情况下,我保留了您拥有的 ... 假数据,因此需要 而不是 尝试计算字符串的小数变化。您可以使用任何您想对列进行子集化的方法,包括此处的整数索引或按名称。

顺便说一句,如果你想对所有列都这样做,那么

dat[] <- lapply(dat, running_change)

dat[] <- 确保在不从 data.frame 更改为 list 的情况下替换列。这是一个把戏;其他方法也有效,但这是我见过的最直接的(也是 code-golf/shortest)。


数据

dat <- structure(list(ISIN1 = c(NA, 0.0425531914893617, -0.0204081632653062), ISIN.2 = c(NA, -0.0118811881188118, 0.0170340681362725), ISIN3 = c(NA, -0.0555555555555556, -0.176470588235294), ... = c("...", "...", "...")), row.names = c(NA, -3L), class = "data.frame")