我有以下关于买入、卖出或按兵不动的数据框架:

df <- structure(list(date = structure(c(17448, 17449, 17450, 17451, 
17452, 17455, 17456, 17457, 17458, 17459), class = "Date"), Activity = c("Buy", 
"Nothing", "Nothing", "Sell", "Nothing", "Sell", "Buy", "Nothing", 
"Nothing", "Nothing")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

我想保持卖出/买入,除非之前的指令与之相反.也就是说,如果有两个连续的"卖出"(可能中间没有"任何"),我只想保留第一个(并用"没有"替换第二个).

我如何才能在没有循环的情况下完成这项工作?考虑一个巨大的数据帧

预期输出(仅第6行已更改):

structure(list(date = structure(c(17448, 17449, 17450, 17451, 
17452, 17455, 17456, 17457, 17458, 17459), class = "Date"), Activity = 
c("Buy", 
"Nothing", "Nothing", "Sell", "Nothing", "Nothing", "Buy", "Nothing", 
"Nothing", "Nothing")), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

推荐答案

我不确定这是否适用于一般情况,因此您可能需要在更大的数据集上进行一些测试,但以下是一个 Select

df %>%
    mutate(tmp = na_if(Activity, "Nothing")) %>%
    fill(tmp) %>%
    mutate(
        Activity = replace(
            Activity, lag(tmp) == tmp & Activity == tmp, "Nothing")) %>%
    select(-tmp)
## A tibble: 10 × 2
#   date       Activity
#   <date>     <chr>   
# 1 2017-10-09 Buy     
# 2 2017-10-10 Nothing 
# 3 2017-10-11 Nothing 
# 4 2017-10-12 Sell    
# 5 2017-10-13 Nothing 
# 6 2017-10-16 Nothing 
# 7 2017-10-17 Buy     
# 8 2017-10-18 Nothing 
# 9 2017-10-19 Nothing 
#10 2017-10-20 Nothing 

其 idea 是创建TRUE/FALSE标志(由逻辑表达式lag(tmp) == tmp & Activity == tmp定义),并基于tmp列中的(滞后的)值,该tmp列具有用先前的值替换所有"Nothing"个值.

R相关问答推荐

多个ggpredicate对象的平均值

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

更改Heatmap Annotation对象的名称

如何利用模型函数在格图中添加双曲/指数曲线

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

在for循环中转换rabrame

将文件保存到新文件夹时,切换r设置以不必创建目录

将小数分隔符放在R中的前两位数字之后

使用rest从header(h2,h3,table)提取分层信息

TreeNode打印 twig 并为其上色

R如何计算现有行的总和以添加新的数据行

在R中,如何将误差条放置在堆叠的每个条上?

扩展R中包含列表的数据框

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

如何计算增加10米(0.01公里)的行?

按组跨多列创建伪变量

如何在使用因子时获得Sankey图的Scale_Fill_Viridis的全范围

排序R矩阵的行和列

合并多个数据帧,同时将它们的名称保留为列名?

对一个列表中另一个列表中的元素进行计数