首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在不使用for循环的情况下继续计算平均值

在不使用for循环的情况下继续计算平均值
EN

Stack Overflow用户
提问于 2018-07-12 17:57:09
回答 3查看 118关注 0票数 3

我的数据框如下所示:

代码语言:javascript
复制
BookValue  Maturity   Yield  Weight
   20      2018     4.000  0.00282
   30      2019     4.550  0.00424
   70      2026     1.438  0.00989
   80      2026     1.438  0.01131
   60      2043     0.000  0.00848
   40      2043     0.000  0.00565

我想要计算所有年份的账面总价值的总和,通过每一步减少一年,以获得以下输出:

代码语言:javascript
复制
Year       Book Value
2018-2043     300 
2019-2043     280
2026-2043     250
2043          100

没有for循环,这是怎么可能的呢?

EN

回答 3

Stack Overflow用户

发布于 2018-07-12 18:17:45

通过base方式,您可以使用rev()cumsum()

代码语言:javascript
复制
val <- tapply(df$BookValue, df$Maturity, sum)
rev(cumsum(rev(val)))

# 2018 2019 2026 2043 
#  300  280  250  100

Data

代码语言:javascript
复制
df <- data.frame(BookValue = c(20, 30, 70, 80, 60, 40),
                 Maturity = c(2018, 2019, 2026, 2026, 2043, 2043))
票数 4
EN

Stack Overflow用户

发布于 2018-07-12 18:17:17

以下是使用base函数的一种可能方法:

代码语言:javascript
复制
#aggregate by year first
ans <- aggregate(dat$BookValue, list(dat$Maturity), sum)
N <- nrow(ans)

#then sum from 1:N, 2:N, 3:N, and so on
if (nrow(ans) >= 1) {
    ans$BVSum <- sapply(1:N, function(n) sum(ans$x[ n:N ]))
}

数据:

代码语言:javascript
复制
dat <- read.table(text="BookValue  Maturity   Yield  Weight
20      2018     4.000  0.00282
30      2019     4.550  0.00424
70      2026     1.438  0.00989
80      2026     1.438  0.01131
60      2043     0.000  0.00848
40      2043     0.000  0.00565", header=TRUE)
票数 2
EN

Stack Overflow用户

发布于 2018-07-12 18:37:32

另一种选择:

代码语言:javascript
复制
# Assuming df is in order we extract first row for each year:
frow <- which(!duplicated(df$Maturity))
n <- nrow(df)


tbv <- lapply(
  frow, 
  function(x) {
    data.frame(
      year = paste0(df$Maturity[x], "-", df$Maturity[n]),
      book_value = sum(df$BookValue[x:n])
    )
  }
)
do.call(rbind, tbv)
       year book_value
1 2018-2043        300
2 2019-2043        280
3 2026-2043        250
4 2043-2043        100
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51302572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档