尝试以下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。我知道这不是计算否的明智方法。每个值的元素。这只是一个方便的问题,它说明了这个问题,该问题发生在一个更加混乱的示例中。
谢谢!
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