按照公式进行计算

3

我需要按照以下公式进行一些计算:

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

我用如下代码进行了一次尝试:

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

我能够按照输出获得B列,但无法处理其余列。

请帮忙解决,谢谢。BM。


1
CD 中的条目如何更新?您只提供了列 B 的规则。 - Maurits Evers
1
您定义了变量B1,但是您将新变量命名为CD(其中任何一个与您定义的公式相对应)。您能否通过说明更清晰一些? - R18
您的问题不完整,请提供所有公式。 - user9589138
更新了问题-希望现在清楚了。 - bradon Mc
1个回答

5
您可以按照以下方式递归执行此操作:
do.call(cbind, Reduce(f = function(A1, B1) A1+(1-A1)*B1, 
                      x = df, 
                      accumulate = TRUE))

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


5
不值得单独回答,但你可能更喜欢 tidyverse 语法 require(tidyverse) df %>% accumulate(~ .x + (1 - .x)*.y) %>% simplify2array。(注:该代码使用了 tidyverse 包中的管道操作符 %>%,以及累积函数 accumulate() 和简化为数组函数 simplify2array()。它对数据框 df 中的每个元素执行一个计算,并将结果累积到先前的值中,最终返回一个数值向量。) - IceCreamToucan
@chinsoon12 - 这个适用于C、D...以及之后的列吗?因为几乎有11列。 - bradon Mc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接