是什么导致“较长的对象长度不是较短的对象长度的倍数”?

问题描述 投票:1回答:1

尝试以下R代码(已加载tidyverse):

dice = data.frame(roll = sample(x = 1:6, size = 1000, replace = TRUE))
ones = dice %>% filter(roll == 1)
length(ones$roll)

mutate(
    data.frame(n = 1:6), 
    len = length(filter(dice, roll == n)$roll)) 

前三行的行为​​符合预期,并合理地计算了所滚动的行数。最后一行给出错误

1 1 152
2 2 152
3 3 152
4 4 152
5 5 152
6 6 152
Warning message:
In roll == n :
  longer object length is not a multiple of shorter object length

我在做什么错?是否将n作为向量而不是对单个值进行运算?

NB。我知道这不是计算否的明智方法。每个值的元素。这只是一个方便的问题,它说明了这个问题,该问题发生在一个更加混乱的示例中。

谢谢!

r dplyr
1个回答
1
投票

dplyr认为按列而不是按行。这意味着它不会在元素之后评估n = c(1,2,3,4,5,6)元素,但会一次评估所有元素。

正在执行:

mutate(
  data.frame(n = 1:6), 
  len = length(filter(dice, roll == n)$roll)) 

我知道


  n len
1 1 164
2 2 164
3 3 164
4 4 164
5 5 164
6 6 164
Warning message:
In roll == n :
  longer object length is not a multiple of shorter object length

与以下相同:

sum(dice$roll == 1:6)

[1] 164
Warning message:
In dice$roll == 1:6 :
  longer object length is not a multiple of shorter object length

[比较两个向量在它们的位置,并根据需要经常回收较短的向量,并在长度不匹配时发出警告。

如果在它们之间插入一个rowwise(),则会在元素之后评估n元素:


data.frame(n = 1:6) %>% rowwise() %>% mutate(len = length(filter(dice, roll == n)$roll)) 

# A tibble: 6 x 2
      n   len
  <int> <int>
1     1   172
2     2   159
3     3   176
4     4   168
5     5   174
6     6   151

© www.soinside.com 2019 - 2024. All rights reserved.