在函数中,收到“`df_slice()` 中的内部错误:列必须与数据框大小匹配。”
Posted
技术标签:
【中文标题】在函数中,收到“`df_slice()` 中的内部错误:列必须与数据框大小匹配。”【英文标题】:In function, receive "Internal error in `df_slice()`: Columns must match the data frame size." 【发布时间】:2022-01-22 13:04:49 【问题描述】:我正在尝试对(可能)分组数据的 cur_data() 运行 filter()
以下工作正常:
lookAhead = 2
colnm = sym(glue("maxCloseGainPctNextlookAhead"))
p = dailyDataFinal %>%
summarise( xxx=nrow(filter(cur_data(), colnm>0)) )
但是当我添加:
p = dailyDataFinal %>%
summarise(n = n(),
xxx = nrow(filter(cur_data(), colnm>0))
)
我明白了:
Error: Problem with `summarise()` column `nPos(2)`.
i `xxx = nrow(filter(cur_data(), maxCloseGainPctNext2 > 0))`.
x Internal error in `df_slice()`: Columns must match the data frame size.
事实上,任何一个总结行本身都很好,只是组合破坏了它,即使 eack 的输出是 1x1 tibble。
我完全无法理解该消息的含义。
输入数据是一个基本的小标题:
> dailyDataFinal
# A tibble: 10,003 x 30
date gspc.adjusted gspc.close gspc.high gspc.low gspc.open gspc.volume gspc.DailyGainPct maxCloseGainPctNext2
<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1982-04-20 115. 115. 117. 115. 116. 54610000 -1.08 1.52
2 1982-04-21 116. 116. 116. 115. 115. 57820000 0.243 2.52
3 1982-04-22 117. 117. 117. 116. 116. 64470000 1.27 1.77
4 1982-04-23 119. 119. 119. 117. 118. 71840000 1.24 0.523
5 1982-04-26 119. 119. 119. 118. 119. 60500000 0.523 -1.06
6 1982-04-27 118 118 119. 118. 119. 56480000 -1.06 -0.627
7 1982-04-28 117. 117. 118. 117. 118. 50530000 -0.627 -0.699
8 1982-04-29 116. 116. 117. 116. 116. 51330000 -0.955 0.586
9 1982-04-30 116. 116. 117. 116. 116. 48200000 0.258 0.876
10 1982-05-03 117. 117. 117. 116. 116. 46490000 0.326 0.728
# ... with 9,993 more rows, and 21 more variables: maxHighGainPctNext2 <dbl>, minCloseGainPctNext2 <dbl>,
# minLowGainPctNext2 <dbl>, maxCloseGainPctNext5 <dbl>, maxHighGainPctNext5 <dbl>, minCloseGainPctNext5 <dbl>,
# minLowGainPctNext5 <dbl>, maxCloseGainPctNext10 <dbl>, maxHighGainPctNext10 <dbl>, minCloseGainPctNext10 <dbl>,
# minLowGainPctNext10 <dbl>, maxCloseGainPctNext20 <dbl>, maxHighGainPctNext20 <dbl>, minCloseGainPctNext20 <dbl>,
# minLowGainPctNext20 <dbl>, range <dbl>, openProp <dbl>, closeProp <dbl>, openLevel <fct>, closeLevel <fct>,
# candleType <glue>
【问题讨论】:
【参考方案1】:如果您制作一个小而可重复的示例供我们测试问题,则更容易提供帮助。根据您的描述,我创建了一个类似的示例,代码对我有用。
函数外的代码。
library(tidyverse)
library(glue)
lookAhead = 2
colnm = sym(glue("abclookAhead"))
set.seed(123)
df <- data.frame(abc1 = rnorm(5), abc2 = rnorm(5))
df %>%
summarise(xxx=nrow(filter(cur_data(), colnm>0)))
# xxx
#1 2
函数内的代码。
fsumm = function(data, lookAhead)
colnm = sym(glue("abclookAhead") )
data %>%
drop_na(colnm ) %>%
summarise("nPos(lookAhead)" := nrow(filter(cur_data(), colnm>0)),
)
fsumm(df, 2)
# nPos(2)
#1 2
对于更新后的问题,使用n := n()
是不正确的,因为n
不是变量。如果您将n = n()
放在summarise
的末尾,它会修复错误。
fsumm = function(data, lookAhead)
colnm = sym(glue("abclookAhead") )
data %>%
drop_na(colnm ) %>%
summarise(
"nPos(lookAhead)" := nrow(filter(cur_data(), colnm>0)),
n = n()
)
fsumm(df, 2)
# nPos(2) n
#1 2 5
另外,我实际上会使用sum
来计算满足条件的条目数,而不是使用filter
和nrow
。如果我们使用它,那么就没有错误。
fsumm = function(data, lookAhead)
colnm = sym(glue("abclookAhead") )
data %>%
drop_na(colnm ) %>%
summarise(n = n(),
"nPos(lookAhead)" := sum(colnm>0)
)
fsumm(df, 2)
# n nPos(2)
#1 5 2
【讨论】:
非常感谢,您说的很对,它/确实/有效。我必须在汇总的开头添加另一行才能使其失败。 ""n(lookAhead)" := n(), " 似乎打破了它。我会更新问题。 是的,外部功能也失败了。首先,使用:=
对n := n()
是不正确的,如果您在"nPos(lookAhead)"
之后添加行n = n()
它可以工作。我不完全确定原因。查看更新后的答案。
爆炸!对不起,错误的海象。我在更新帖子后意识到我可以简化问题,但我尝试在处理脚踝咬伤的同时进行剪切和粘贴:)。不过,R 并没有抱怨。
sum() 是更好的解决方案,非常感谢。
rstudio.community 怀疑这是一个错误。如果您想看看会发生什么,请在 github.com/tidyverse/dplyr/issues/6138 提出问题。以上是关于在函数中,收到“`df_slice()` 中的内部错误:列必须与数据框大小匹配。”的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Flutter 中使用 Firebase Messaging ^8.0.0-dev.8 收到通知时运行函数?
在IBM BPM dojo coachview中收到指出“ name.split不是函数”的错误
我收到“等待仅在异步函数中有效”错误我的代码是这样的 [重复]
在 xpath 中传递 Datatable 项并收到错误“javascript 错误:参数 [0].scrollIntoView 不是函数”