【问题标题】:Calculations as per the formula按公式计算
【发布时间】:2018-09-18 16:50:43
【问题描述】:

我需要根据以下公式进行一些计算:

B1 = A1 + (1-A1) * B1

示例:

B1 = 0.2 + (1 - 0.2) * 0.4
   = 0.52

C1 = 0.4 + (1 - 0.4) * 0.8
   = 0.904

D1 = 0.8 + (1 - 0.8) * 0.5
   = 0.952

其他行其他列同样的逻辑,一共11个。

数据框:

df

A        B      C        D
0.2     0.4     0.8     0.5
0.4     0.5     0.6     0.2
0.8     0.1     0.5     0.4
0.3     0.4     0.1     0.8

预期输出:

A       B       C       D
0.2     0.52    0.904   0.952
0.4     0.7     0.88    0.904
0.8     0.82    0.91    0.946
0.3     0.58    0.622   0.9244

我用下面的代码试了1次:

Df <- df[-ncol(df)] + ( 1 – df[-ncol(df)]) * df[-1]

我能够根据输出获得 B 列,但不适用于该列的其余部分。 请帮忙,谢谢。 BM。

【问题讨论】:

  • CD 列中的条目如何更新?你只给列B一个规则。
  • 您定义了B1,但随后您将新变量命名为CD(其中任何一个都对应于您定义的公式)。你能解释清楚一点吗?
  • 您的问题不完整。请提供所有公式。
  • 更新了问题-希望现在清楚。

标签: r loops dataframe


【解决方案1】:

您可以递归地执行此操作,如下所示:

do.call(cbind, Reduce(f = function(A1, B1) A1+(1-A1)*B1, 
                      x = df, 
                      accumulate = TRUE))

说明: 由于 df 是一个向量列表的 data.frame,Reduce 将获取每个向量并应用您的函数。然后do.call(cbind,...)将结果合并到一个data.frame中。

【讨论】:

  • 不值得单独回答,但您可能更喜欢tidyverse 语法require(tidyverse) df %&gt;% accumulate(~ .x + (1 - .x)*.y) %&gt;% simplify2array
  • @chinsoon12 - 这是否适用于 C、D ......等等......因为几乎有 11 列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 1970-01-01
相关资源
最近更新 更多