【问题标题】:For Loop or Function to Conditionally Subtract values of Two ColumnsFor 循环或函数有条件地减去两列的值
【发布时间】:2019-01-08 16:46:30
【问题描述】:

我在一个数据框中有两列:

x    y
0    1000
0    1000
4    1000
2    1000
10   1000
5    1000

我想要做的是编写一个for循环或函数(哪个更有效),它可以循环遍历y中的每个单元格,用同一行中x的值减去这个值并将结果输入到一个新列中“z”。

诀窍是我想要一个条件,它每次都记住 z 的最后计算值是什么,以便它不断记住循环或函数的最后结果并从中减去 x 而不是每次都减去 y 的相同值时间,因为 y 始终是常数。这会是什么样子:

输出:

x    y       z
0    1000    1000
0    1000    1000
4    1000    996
2    1000    **994** #rather than 998
10   1000    **984**
5    1000    **979**

这样做的目的是测量样本量的分解。

【问题讨论】:

    标签: r function for-loop


    【解决方案1】:

    我们取 'x' 列的累积和并从 'y' 中减去以创建 'z' 列

    df1$z <- with(df1, y - cumsum(x))
    df1$z
    #[1] 1000 1000  996  994  984  979
    

    【讨论】:

    • 效果很好。但是,当我第一次描述数据时,我犯了一个错误。显然 y 列值每 10 行更改一次。有没有办法编写一个每 N 行重新启动的循环或函数?一个例子是 y 的前 10 行是 1000,然后它变为 2000。我不希望 x 的累积总和在前 10 行之后结转到 y 的新值。
    • @Kardinol 您可以为每 10 行创建一个组 b。即library(dplyr); df1 %&gt;% group_by(grp = as.integer(gl(n(), 10, n()))) %&gt;% mutate(z = y - cumsum(x))
    • 如果你的 y 列不是每 10 行就改变一次,你可以试试这个:for(i in 1:nrow(df)) {df$z[i]=ifelse(i==1,df$y[i]-df$x[i],ifelse(df$y[i]==df$y[i-1],df$y[i]-cumsum(df$x[i]),df$y[i]-df$x[i]))}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 2021-12-03
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多