【问题标题】:arrange dataframe based on one column eliminating the unwanted responses根据一列排列数据框,消除不需要的响应
【发布时间】:2018-12-27 12:34:23
【问题描述】:

我有这个数据

       date                                           signal 
1   2009-01-13 09:55:00  4645.00  4838.931  5358.883  Buy2
2   2009-01-14 09:55:00  4767.50  4718.254  5336.703  Buy1
3   2009-01-15 09:55:00  4485.00  4653.316  5274.384  Buy2
4   2009-01-16 09:55:00  4580.00  4537.693  5141.435  Buy1
5   2009-01-19 09:55:00  4532.00  4548.088  4891.041  Buy2
6   2009-01-27 09:55:00  4190.00  4183.503  4548.497  Buy1
7   2009-01-30 09:55:00  4436.00  4155.236  4377.907 Sell1
8   2009-02-02 09:55:00  4217.00  4152.626  4390.802 Sell2
9   2009-02-09 09:55:00  4469.00  4203.437  4376.277 Sell1
10  2009-02-12 09:55:00  4469.90  4220.845  4503.798 Sell2
11  2009-02-13 09:55:00  4553.00  4261.980  4529.777 Sell1
12  2009-02-16 09:55:00  4347.20  4319.656  4564.387 Sell2
13  2009-02-17 09:55:00  4161.05  4371.474  4548.912  Buy2
14  2009-02-27 09:55:00  3875.55  3862.085  4101.929  Buy1
15  2009-03-02 09:55:00  3636.00  3846.423  4036.020  Buy2
16  2009-03-12 09:55:00  3420.00  3372.665  3734.949  Buy1
17  2009-03-13 09:55:00  3656.00  3372.100  3605.357 Sell1
18  2009-03-17 09:55:00  3650.00  3360.421  3663.322 Sell2
19  2009-03-18 09:55:00  3721.00  3363.735  3682.293 Sell1
20  2009-03-20 09:55:00  3687.00  3440.651  3784.778 Sell2

并且必须以这种形式安排它

2   2009-01-14 09:55:00  4767.50  4718.254  5336.703  Buy1
7   2009-01-30 09:55:00  4436.00  4155.236  4377.907 Sell1
8   2009-02-02 09:55:00  4217.00  4152.626  4390.802 Sell2
13  2009-02-17 09:55:00  4161.05  4371.474  4548.912  Buy2
14  2009-02-27 09:55:00  3875.55  3862.085  4101.929  Buy1
17  2009-03-13 09:55:00  3656.00  3372.100  3605.357 Sell1
18  2009-03-17 09:55:00  3650.00  3360.421  3663.322 Sell2

因此数据按照 Buy1 Sell1 Sell2 Buy2 的顺序排列并消除中间观察值。 我已经尝试了几个 dplyr:filter 命令,但没有一个给出所需的输出。

【问题讨论】:

    标签: r dataframe dplyr rstudio sequence


    【解决方案1】:

    如果我已经很好地理解了您的问题,下面的代码应该可以解决它。改编自this discussion

    这个想法是将你的序列定义为一个模式:

    pattern <- c("Buy1", "Sell1", "Sell2", "Buy2")
    

    然后找到这个模式在你的专栏中的位置:

    library(zoo)
     pos <- which(rollapply(data$signal, 4, identical, pattern, fill = FALSE, align = "left")) 
    

    并根据图案的位置提取行:

    rows <- unlist(lapply(pos, function(x, n) seq(x, x+n-1), 4))
    data_filtered <- data[rows,]
    

    瞧。

    编辑

    由于我误解了您的问题,这里有一个新的解决方案。 您想在列中检索序列“Buy1”、“Sell1”、“Sell2”、“Buy2”,并消除不适合此序列的观察值。我没有看到一个简单的矢量化解决方案,所以这里有一个循环来解决这个问题。根据数据的大小,您可能希望在 RCPP 中实现类似的算法或以某种方式对其进行矢量化。

    sequence <- c("Buy1", "Sell1", "Sell2", "Buy2")
    keep <- logical(length(data$signal))
    
    s <- 0
    for (i in seq(1, length(data$signal))){
        if (sequence[s +1] == data$signal[i]){
            keep[i] <- T
            s <- (s + 1) %% 4
        } else {
            keep[i] <- F
        }
    }
    
    data_filtered <- data[keep,]
    

    告诉我这是否更好。 如果有人有矢量化解决方案,我很想看看。

    【讨论】:

    • 这不是我需要的。仔细阅读我的数据我想按这个顺序排列我的数据 c("Buy1", "Sell1", "Sell2", "Buy2") 当然但是从第一个 Buy1 开始出现在数据中然后消除中间观察到随后的 Sell1 然后消除中间观察到随后的 Sell2 等等
    • 我已编辑我的答案以更好地回答您的问题。我希望您的数据不会太大,并且该解决方案适合您。
    【解决方案2】:

    您可以将列 data$signal 强制转换为一个因子并定义级别。

    data$signal <- as.factor(data.$signal, levels = c("Buy1","Sell1","Buy2","Sell2")
    

    然后就可以排序了

    sorted.data <- data[order(signal),]
    

    这是一个很好的答案,它谈到了你想做什么:

    Sort data frame column by factor

    【讨论】:

    • 如果认为 OP 想要“消除中间观察”。
    【解决方案3】:

    这是Rcpp 解决方案:

    library(Rcpp)
    
    cppFunction('LogicalVector FindHit(const CharacterVector x, const CharacterVector y) {
        LogicalVector res(x.size());
        int k = 0;
        for(int i = 0; i < x.size(); i++){
            if(x[i] == y[k]){
                res[i] = true;
                k = (k + 1) % y.size();
            }
        }
        return res;
    }')
    
    dtt[FindHit(dtt$V6, c('Buy1', 'Sell1', 'Sell2', 'Buy2')),]
    
    #            V1       V2      V3       V4       V5    V6
    # 2  2009-01-14 09:55:00 4767.50 4718.254 5336.703  Buy1
    # 7  2009-01-30 09:55:00 4436.00 4155.236 4377.907 Sell1
    # 8  2009-02-02 09:55:00 4217.00 4152.626 4390.802 Sell2
    # 13 2009-02-17 09:55:00 4161.05 4371.474 4548.912  Buy2
    # 14 2009-02-27 09:55:00 3875.55 3862.085 4101.929  Buy1
    # 17 2009-03-13 09:55:00 3656.00 3372.100 3605.357 Sell1
    # 18 2009-03-17 09:55:00 3650.00 3360.421 3663.322 Sell2
    

    这里是dtt

    > dput(dtt)
    structure(list(V1 = c("2009-01-13", "2009-01-14", "2009-01-15", 
    "2009-01-16", "2009-01-19", "2009-01-27", "2009-01-30", "2009-02-02", 
    "2009-02-09", "2009-02-12", "2009-02-13", "2009-02-16", "2009-02-17", 
    "2009-02-27", "2009-03-02", "2009-03-12", "2009-03-13", "2009-03-17", 
    "2009-03-18", "2009-03-20"), V2 = c("09:55:00", "09:55:00", "09:55:00", 
    "09:55:00", "09:55:00", "09:55:00", "09:55:00", "09:55:00", "09:55:00", 
    "09:55:00", "09:55:00", "09:55:00", "09:55:00", "09:55:00", "09:55:00", 
    "09:55:00", "09:55:00", "09:55:00", "09:55:00", "09:55:00"), 
        V3 = c(4645, 4767.5, 4485, 4580, 4532, 4190, 4436, 4217, 
        4469, 4469.9, 4553, 4347.2, 4161.05, 3875.55, 3636, 3420, 
        3656, 3650, 3721, 3687), V4 = c(4838.931, 4718.254, 4653.316, 
        4537.693, 4548.088, 4183.503, 4155.236, 4152.626, 4203.437, 
        4220.845, 4261.98, 4319.656, 4371.474, 3862.085, 3846.423, 
        3372.665, 3372.1, 3360.421, 3363.735, 3440.651), V5 = c(5358.883, 
        5336.703, 5274.384, 5141.435, 4891.041, 4548.497, 4377.907, 
        4390.802, 4376.277, 4503.798, 4529.777, 4564.387, 4548.912, 
        4101.929, 4036.02, 3734.949, 3605.357, 3663.322, 3682.293, 
        3784.778), V6 = c("Buy2", "Buy1", "Buy2", "Buy1", "Buy2", 
        "Buy1", "Sell1", "Sell2", "Sell1", "Sell2", "Sell1", "Sell2", 
        "Buy2", "Buy1", "Buy2", "Buy1", "Sell1", "Sell2", "Sell1", 
        "Sell2")), row.names = c(NA, -20L), class = "data.frame")
    

    【讨论】:

    • 源错误(scriptPath, local = env) :.sourceCpp_1_DLLInfo
    • @davidjones 对不起。此代码在 Linux (ubuntu 16.04) 上进行了测试。我没有 Windows PC,无法就 Windows 上的错误消息提供任何建议。
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2021-12-06
    • 1970-01-01
    相关资源
    最近更新 更多