在函数中,收到“`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 来计算满足条件的条目数,而不是使用filternrow。如果我们使用它,那么就没有错误。

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()` 中的内部错误:列必须与数据框大小匹配。”的主要内容,如果未能解决你的问题,请参考以下文章

为啥我收到“错误 25:预期:;”在这个函数定义中?

为啥我在函数内部调用时会收到“错误:无效的挂钩调用”?

如何在 Flutter 中使用 Firebase Messaging ^8.0.0-dev.8 收到通知时运行函数?

在IBM BPM dojo coachview中收到指出“ name.split不是函数”的错误

我收到“等待仅在异步函数中有效”错误我的代码是这样的 [重复]

在 xpath 中传递 Datatable 项并收到错误“javascript 错误:参数 [0].scrollIntoView 不是函数”