gpt4 book ai didi

r - 使用 apply 函数在 data.frame 中进行计算而不更改我的日期列的格式

转载 作者:行者123 更新时间:2023-12-04 11:45:29 25 4
gpt4 key购买 nike

这是我的数据框:

df<-structure(list(Data = structure(c(18158, 18157, 18156, 18155, 
18152), class = "Date"), A = c(19.46, 19.26, 19.43, 19.44,
19.1), B = c(49.72, 49.2, 48.45, 47, 51.34), C = c(45.69,
44.92, 44.12, 43.07, 43), D = c(48.32, 48.02, 47.3, 46.65,
47.14)), row.names = c(NA, 5L), class = "data.frame")

我想使用应用函数进行以下计算, 但没有提取物日期列:
new.df<-apply(df,2, function(x) (-diff(x)/x[-length(x)]))

我无法执行此操作,因为有一个“日期”格式列。如何更改我的应用函数来处理它,结果一直给一个数据框,第一列仍然是“日期”格式?

最佳答案

如果我们知道 'Date' 列的位置,则使用索引方法删除该列

f1 <- function(x) (-diff(x)/x[-length(x)])
apply(df[-1], 2, f1)

或者为了减少出错的可能性,使用 name 删除列
apply(df[setdiff(names(df), 'Data')], 2, f1)
apply转换为 matrixmatrix只能有一个类型。所以,会发生什么是 Date如果类也包含在内,它就会被强制转换为整数存储模式。

如果有 character列,所有元素将被转换为 character并且计算不起作用
diff函数返回输出 lengthlength少一个如果我们需要更新数据集的原始列,就会有 length不匹配。为了避免这种附加 NA一开始
f2 <- function(x) (c(NA, -diff(x)/x[-length(x)]))
df[-1] <- apply(df[-1],2, f2)

如果我们正在创建新列
df[paste0(names(df)[-1], "_diffs")] <- apply(df[-1],2, f2)

或者让它更有活力
i1 <- sapply(df, is.numeric)
apply(df[i1], 2, f1)

此外,对于具有多种类型的数据集,可以使用 lapply/sapply
lapply(df[i1], function(x) -diff(x)/x[-length(x)])

dplyr ,我们可以使用 mutate_if
library(dplyr)
df %>%
mutate_if(is.numeric, ~ c(NA_real_, diff(.)/.[-n()]))
# Data A B C D
#1 2019-09-19 NA NA NA NA
#2 2019-09-18 -0.010277492 -0.01045857 -0.016852703 -0.006208609
#3 2019-09-17 0.008826584 -0.01524390 -0.017809439 -0.014993753
#4 2019-09-16 0.000514668 -0.02992776 -0.023798731 -0.013742072
#5 2019-09-13 -0.017489712 0.09234043 -0.001625261 0.010503751

如果我们需要创建新列,请将其放在 list 中并按照 list 进行命名
df %>%
mutate_if(is.numeric, list(diffs = ~ c(NA_real_, diff(.)/.[-n()])))
# Data A B C D A_diffs B_diffs C_diffs D_diffs
#1 2019-09-19 19.46 49.72 45.69 48.32 NA NA NA NA
#2 2019-09-18 19.26 49.20 44.92 48.02 -0.010277492 -0.01045857 -0.016852703 -0.006208609
#3 2019-09-17 19.43 48.45 44.12 47.30 0.008826584 -0.01524390 -0.017809439 -0.014993753
#4 2019-09-16 19.44 47.00 43.07 46.65 0.000514668 -0.02992776 -0.023798731 -0.013742072
#5 2019-09-13 19.10 51.34 43.00 47.14 -0.017489712 0.09234043 -0.001625261 0.010503751

关于r - 使用 apply 函数在 data.frame 中进行计算而不更改我的日期列的格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58051418/

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