每三行数据帧相加一次,并乘以新结果-R
我有一个数据框,我想每三行添加一次。然后,将cumprod应用于这些行,以便在生成的新行中有一个新的data.frame 最后,我将只有行数的三分之一 下面你可以找到一些我写的代码。我试图寻找对象的类别,并复制一个适用于向量而不是矩阵的代码每三行数据帧相加一次,并乘以新结果-R,r,matrix,aggregate,R,Matrix,Aggregate,我有一个数据框,我想每三行添加一次。然后,将cumprod应用于这些行,以便在生成的新行中有一个新的data.frame 最后,我将只有行数的三分之一 下面你可以找到一些我写的代码。我试图寻找对象的类别,并复制一个适用于向量而不是矩阵的代码 XYZ<-read.xlsx2("XYZ.xlsx",1) XYZ.CUT<-aggregate(XYZ~gl(nrow(XYZ)/3, 3), data.frame(XYZ), sum) F.XYZ<-apply(
XYZ<-read.xlsx2("XYZ.xlsx",1)
XYZ.CUT<-aggregate(XYZ~gl(nrow(XYZ)/3, 3), data.frame(XYZ), sum)
F.XYZ<-apply(t(XYZ.CUT+1),1,cumprod)
首先,我想:
X Y Z
-0,16% 0,25% 0,59%
-0,02% -0,11% 0,86%
-0,50% -0,12% 0,39%
在每个元素中添加1后:
X Y Z
(1-0,16%) (1+0,25%) (1+0,59%)
(1-0,02%) (1-0,11%) (1+0,86%)
(1-0,50%) (1-0,12%) (1+0,39%)
我想用以下行制作一个cumprod:
X Y Z
x1 y1 z1
x1*x2 y1*y2 z1*z2
x1*x2*x3 y1*y2*y3 z1*z2*z3
高级问候语。我们可以通过以下方式,仅使用基本R:
#First remove the % symbol from the columns and convert the values to numeric
XYZ[] <- lapply(XYZ, function(x) as.numeric(sub("%", "", x)))
#Sum every 3 rows
XYZ.CUT <- aggregate(.~ gl(nrow(XYZ)/3, 3),XYZ, sum)[-1]
#Add 1 and take cumulative product for each row
t(apply(XYZ.CUT + 1, 1, cumprod))
#Or if you need it columnwise use
#apply(XYZ.CUT + 1, 2, cumprod)
# X Y Z
#[1,] 0.84 1.0668 1.696212
#[2,] 0.98 0.8722 1.622292
#[3,] 0.50 0.4400 0.611600
#首先从列中删除%符号,并将值转换为数字
XYZ[]我们可以使用tidyverse
。使用readr
中的parse_number
,从列(mutate_all
)中提取数字部分,按使用gl
创建的索引分组,汇总
所有列以获得总和
library(tidyverse)
library(readr)
out <- XYZ %>%
mutate_all(parse_number) %>%
group_by(grp = as.integer(gl(n(), 3, n()))) %>%
summarise_all(sum)
数据
XYZ另一个基本R版本,使用rowsum
获取聚合总和(使用@Akrun的XYZ
数据集):
XYZ[]您有、
或`。列中
library(tidyverse)
library(readr)
out <- XYZ %>%
mutate_all(parse_number) %>%
group_by(grp = as.integer(gl(n(), 3, n()))) %>%
summarise_all(sum)
library(matrixStats)
rowCumprods(as.matrix(out[-1]) + 1)
# [,1] [,2] [,3]
#[1,] 0.84 1.0668 1.696212
#[2,] 0.98 0.8722 1.622292
#[3,] 0.50 0.4400 0.611600
XYZ <- structure(list(X = c("-0.01%", "-0.04%", "-0.11%", "0.03%", "0.02%",
"-0.07%", "-0.12%", "-0.01%", "-0.37%"), Y = c("0.32%", "0.01%",
"-0.06%", "-0.04%", "0.04%", "-0.11%", "-0.13%", "-0.07%", "0.08%"
), Z = c("0.11%", "0.45%", "0.03%", "0.45%", "0.30%", "0.11%",
"0.30%", "0.04%", "0.05%")), row.names = c(NA, -9L), class = "data.frame")
XYZ[] <- lapply(XYZ, sub, pat="%$", rep="")
XYZ[] <- lapply(XYZ, as.numeric)
out <- rowsum(XYZ, (seq_len(nrow(XYZ)) + 2) %/% 3) + 1
## column-wise cumprod
out[] <- lapply(out, cumprod)
out
# X Y Z
#1 0.8400 1.270000 1.590000
#2 0.8232 1.130300 2.957400
#3 0.4116 0.994664 4.110786
## row-wise cumprod
out[] <- Reduce(`*`, out, accumulate=TRUE)
out
# X Y Z
#1 0.84 1.0668 1.696212
#2 0.98 0.8722 1.622292
#3 0.50 0.4400 0.611600