library(tidytable)

my_dt <- tidytable(
     price = c(4.5, 4.6, 4.7, 4.8, 5.1),
     volume = c(0.4,1.2,0.3,8.7,6.5)
)

total = my_dt %>% summarize(total = sum(volume)) %>% pull(total)

trim = total*0.25

我想做的是找到总体积的25%的价格值.然后将这一行分成"修剪"部分和非修剪部分.所以在这个例子中,我将以如下所示的东西结束:

post_trim <- tidytable(
         price = c(4.5, 4.6, 4.7, 4.8, 4.8, 5.1),
         volume = c(0.4, 1.2, 0.3, 2.375, 6.325, 6.5),
         trim = c(True, True, True, True, False, False)
    )

我最初想到的方法是遍历rame的行,其中行将作为列表返回,并跟踪减go 数量后的余数,直到我找到余数小于体积的行:

remainder = trim
pivot = 0

for (row in my_dt){
    if (remainder <= row[2]){
        pivot = row[1]
        break
    } else { 
        remainder = remainder - row[2]
    }

然后,我只需删除WHERE PRICE==PIVOT的行条目,并重新输入两行,一行中的体积是余数,另一行中的体积是原始的体积-余数.

我知道在行上循环通常不是一个好主意,所以我想知道我如何在不这样做的情况下完成这一点?

推荐答案

这种问题在基数R中比较容易处理:

trim <- sum(my_dt$volume) * 0.25
csum <- cumsum(my_dt$volume)
# identify 25th %ile row
trow <- min(which(csum >= trim))

# duplicate 25th %ile row
my_dt <- my_dt[c(1:trow, trow:nrow(my_dt)), ]
# trim value, with safeguard if first row
my_dt$volume[[trow]] <- if (trow == 1) trim else trim - csum[[trow - 1]]
# remainder in next row
my_dt$volume[[trow + 1]] <- csum[[trow]] - trim
# add logical flag
my_dt$trim <- seq(nrow(my_dt)) <= trow

结果:

# A tibble: 6 × 3
  price volume trim 
  <dbl>  <dbl> <lgl>
1   4.5   0.4  TRUE 
2   4.6   1.2  TRUE 
3   4.7   0.3  TRUE 
4   4.8   2.37 TRUE 
5   4.8   6.32 FALSE
6   5.1   6.5  FALSE

R相关问答推荐

名称输出pmap on tible

用值序列对行进行子集化,并标识序列开始的列

在GGPLATE中将突出的点放在前面

如何计算多个日期是否在一个日期范围内

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

用关联字符串替换列名的元素

以字符格式导入的ExcelElectron 表格日期列标题

从R中的对数正态分布生成随机数的正确方法

计算直线上点到参考点的总距离

在带有`R`中的`ggmosaic`的马赛克图中使用图案而不是 colored颜色

如何使用前缀作为匹配来连接数据帧?

如何平滑或忽略R中变量的微小变化?

在gggraph中显示来自不同数据帧的单个值

ggplot R:X,Y,Z使用固定/等距的X,Y坐标绘制六边形热图

变异以按组从其他列创建具有最大和最小值的新列

Data.table::Shift type=允许扩展数据(&Q;LAG&Q;)

位置_道奇在geom_point图中不躲避

使用dqur在不同变量上创建具有多个条件的变量

通过不完全重叠的多个柱连接

如何在类应用函数中访问函数本身