使用Lappy在data.frames列表上创建列值的条件和

使用Lappy在data.frames列表上创建列值的条件和,r,R,我有如下示例所示的数据: [[1]] KRW.LOW.1 KRW.LOW.1.1 KRW.50D KRW.LOW.1.2 2014-08-11 -1 1 1 5 2014-08-12 -1 1 1 10 [[2]]] EUR.CLOSE EUR.CLOSE.1 EUR.50D EUR.CLOSE.2 2014-08-29 -1

我有如下示例所示的数据:

[[1]]
           KRW.LOW.1 KRW.LOW.1.1 KRW.50D   KRW.LOW.1.2
2014-08-11        -1          1       1    5
2014-08-12        -1          1       1    10

[[2]]]
           EUR.CLOSE EUR.CLOSE.1 EUR.50D   EUR.CLOSE.2
2014-08-29        -1          -1       1    3
2014-09-01        -1           1       1    1
2014-09-02         0          -1       0    2
这是数据帧的列表。我想根据前三列的条件对第四行(VAR.CLOSE.2)中的元素求和。条件是:

  • 列1具有非负值或
  • 第2列严格大于零或
  • 第3列是非负的
  • 换句话说,作为一个说明性的例子,如果我只是检查一个数据帧,我想要类似于
    sum(x[x[,1]!=0 | x[,2]>0 | x[,3]!=0]),4)

    在上面给出的例子中,我想得到以下计算结果:

    [[1]]
                  KRW 
    ReturnSum     15 
    
    
    [[2]]
                  EUR 
    ReturnSum     5
    
    因为最后一行不满足3个条件中的任何一个,所以我们只对前2行求和得到5欧元。特别是,条件
    数据[[2]][3,1]!=0
    数据[[2]][3,3]!=0
    两者都失败,
    数据[[2]][3,2]>0

    我试着用你的方式来实现这一点

    i <- 1:length(FlaggingTrend)
    SumReturns <- lapply(FlaggingTrend[[i]], function(x) sum(x[which(x[,2]!=0|x[,3]>0|x[,4]!=0),4]))
    

    您可以尝试使用purrr:

    map_df(FlaggingTrend, function(x) {
    co <- stringr::str_extract(names(x)[1], "\\w+")
    names(x) <- c(names(x[[1]]))
    x %>% 
        filter(EUR.CLOSE != 0, EUR.50D > 0, EUR.CLOSE.1 != 0) %>% 
        mutate(co = co) %>%
        group_by(co) %>%
        summarize(Sum_Var = sum(EUR.CLOSE.2))
    })
    
    map_-df(标记趋势,功能(x){
    co 0,欧元收盘价。1!=0)%>%
    突变(co=co)%>%
    集团(co)%>%
    汇总(总和=总和(欧元收盘价2))
    })
    

    列表中的每个数据帧都将其列重命名为第一列。这不会返回示例中的值,但过滤应该可以正常工作。

    很难判断您想要什么。可能是这样的:
    lappy(dat,函数(x)sum(x[x[1:3,1]!=0 | x[1:3,2]>0 | x[1:3,3]!=0),4])
    @count对不起,是的。我可以尝试用更简单的数据编辑我的示例,这样就不会太碍眼了。我不确定
    x[哪个(x[1:3,1]!=0 | x[1:3,2]>0 | x[1:3,3]!=0),4]
    是否有效,因为我正在处理一个跨越200多行的更大数据集。我将编辑我的帖子以使其更清晰。@count也很抱歉,我尝试使用了你的
    lappy
    函数,但我得到了一个
    NA
    列表,我不喜欢purr,但谢谢你!然而,当我尝试它时,我得到一个错误,说foo未找到。当我用FlaggingTrend替换foo时,我在
    [[这只是我的一个错误。Map_df的工作原理与Lappy非常相似,因此您将列表中的每个元素定义为x的函数。我只是没有通过修补修复变量。抱歉,我再次打扰您,但在更改为x后,我得到了
    错误:每个变量都必须命名。问题变量:1、2、3、4
    。如果这是一个相当愚蠢的问题,我很抱歉stion,但这可能是因为
    过滤器(EUR.CLOSE!=0…
    ,因为我有更多名为JPY、GBP、CHF、NOK…等的变量(结构类似)?没问题。我能够重现问题并找到解决方案。这与我设置重命名每个元素x的方式有关。
    名称(x[[1]])
    随着列表的每个元素而变化。这是我们不希望发生的事情。要了解为什么只运行
    map\u df(FlaggingTrend,function(x)x)
    。这会将列绑定在一起,但不会创建有用的数据框。因此,我们需要创建一个每个列都可以使用的静态名称列表。我刚才使用了:
    name\u list
    
    map_df(FlaggingTrend, function(x) {
    co <- stringr::str_extract(names(x)[1], "\\w+")
    names(x) <- c(names(x[[1]]))
    x %>% 
        filter(EUR.CLOSE != 0, EUR.50D > 0, EUR.CLOSE.1 != 0) %>% 
        mutate(co = co) %>%
        group_by(co) %>%
        summarize(Sum_Var = sum(EUR.CLOSE.2))
    })