Почему в этом фрагменте «длина объекта не кратна длине объекта»? - PullRequest
1 голос
/ 17 октября 2019

Попробуйте следующий код 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)) 

Первые 3 строки ведут себя, как и ожидалось, и дают разумное количество для числа брошенных. Последняя строка выдает ошибку

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 как вектор вместо того, чтобы работать с отдельными значениями?

Примечание. Я знаю, что это не разумный способ считать нет. элементы с каждым значением. Это просто удобная проблема, чтобы проиллюстрировать проблему, которая встречается в более запутанном примере.

Спасибо!

1 Ответ

1 голос
/ 17 октября 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...