对所有列重复一个成功的循环
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")
我在 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")