gpt4 book ai didi

从 R 数据框中的某个位置滚动求和

转载 作者:行者123 更新时间:2023-12-01 15:23:38 25 4
gpt4 key购买 nike

假设我有以下数据,dat1;

width  from  by
2 1 A
3 1 A
2 2 A
3 2 A
2 1 B
3 1 B
2 2 B
3 2 B

另外还有,dat2;

x      pos   by
4 1 A
5 2 A
7 3 A
3 4 A
2 1 B
4 2 B
3 3 B
5 4 B

假设我想在 dat1 上创建一个新列,其中包含来自 dat2 的滚动总和值;

  1. 此滚动总和的宽度等于该行中给出的宽度

  2. 我们的起始位置等于该行中的起始向量值

  3. 我们希望根据行中的级别对 A 或 B 因子执行此操作

到目前为止我已经有了我们想要的

rollapply(x = dat2$x, width = dat1$width, FUN = sum, align = "left", data = dat2)

所以我需要合并起始位置和该起始位置的因子水平。

所以在这种情况下我想得到

width  from  by   RS
2 1 A 9
3 1 A 16
2 2 A 12
3 2 A 15

等等

任何帮助将不胜感激。谢谢

最佳答案

1) 对于每一行 idat1匿名函数将 dat2 子集为 bydat1并从中选出 x 的指定行并对它们求和:

transform(dat1, RS = sapply(1:nrow(dat1), function(i) 
sum(subset(dat2, dat1$by[i] == by)[seq(from[i], length = width[i]), "x"])))

给予:

  width from by RS
1 2 1 A 9
2 3 1 A 16
3 2 2 A 12
4 3 2 A 15
5 2 1 B 6
6 3 1 B 9
7 2 2 B 7
8 3 2 B 12

2) 另一种方法是计算要在 dat2 中求和的序列的起始值和宽度。然后应用它:

st <- match(dat1$by, dat2$by) + dat1$from - 1
w <- dat1$width
Sum <- function(st, w) sum(dat2[seq(st, length = w), "x"])
transform(dat1, RS = mapply(Sum, st, w))

给予:

  width from by RS
1 2 1 A 9
2 3 1 A 16
3 2 2 A 12
4 3 2 A 15
5 2 1 B 6
6 3 1 B 9
7 2 2 B 7
8 3 2 B 12

注意

dat1dat2可重现的形式是:

Lines1 <- "
width from by
2 1 A
3 1 A
2 2 A
3 2 A
2 1 B
3 1 B
2 2 B
3 2 B"
dat1 <- read.table(text = Lines1, header = TRUE)

Lines2 <- "
x pos by
4 1 A
5 2 A
7 3 A
3 4 A
2 1 B
4 2 B
3 3 B
5 4 B"
dat2 <- read.table(text = Lines2, header = TRUE)

更新

已修复 (1)。添加了(2)。

关于从 R 数据框中的某个位置滚动求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49266061/

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