使用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)中的元素求和。条件是:
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))
})