Вопрос по r – Почему я получаю «предупреждение, что длина объекта не кратна длине объекта»?

25

У меня есть датафрейм dih_y2. Эти две строки дают мне предупреждение:

> memb = dih_y2$MemberID[1:10]
> dih_col = which(dih_y2$MemberID == memb)  
Warning message:
In dih_y2$MemberID == memb :
longer object length is not a multiple of shorter object length

Зачем?

Ваш Ответ

2   ответа
18

Когда вы выполняете булево сравнение между двумя векторами в R, «ожидание» является то, что оба вектора имеют одинаковую длину, так что R может сравнить каждый соответствующий элемент по очереди.

R имеет очень любимую (или ненавистную) особенность под названиемпереработка отходовгде при многих обстоятельствах, если вы попытаетесь сделать что-то, где R обычно ожидает, что объекты будут иметь одинаковую длину, он автоматически расширит или переработает более короткий объект, чтобы оба объекта были одинаковой длины.

Если более длинный объект кратен более короткому, это равносильно повторению более короткого объекта несколько раз. Часто программисты R используют это, чтобы делать вещи более компактно и с меньшим набором текста.

Но если они не являются кратными, R будет беспокоиться о том, что вы, возможно, допустили ошибку, и, возможно, не имели в виду выполнить это сравнение, отсюда и предупреждение.

Исследуйте себя с помощью следующего кода:

> x <- 1:3
> y <- c(1,2,4)
> x == y
[1]  TRUE  TRUE FALSE
> y1 <- c(y,y)
> x == y1
[1]  TRUE  TRUE FALSE  TRUE  TRUE FALSE
> y2 <- c(y,2)
> x == y2
[1]  TRUE  TRUE FALSE FALSE
Warning message:
In x == y2 :
  longer object length is not a multiple of shorter object length
53

Вы не приводите воспроизводимый пример, но в вашем предупреждающем сообщении указывается, в чем именно заключается проблема.

длина memb равна только 10. Я предполагаю, что длина dih_y2 $ MemberID не кратна 10. При использовании == он выдаст предупреждение, если оно не кратно, чтобы вы знали, что это, вероятно, не делать то, что вы ожидаете. == выполняет поэлементную проверку на равенство. Я подозреваю, что вы хотите сделать, если найдете, какой из элементовdih_y2$MemeberID также в вектореmemb, Для этого вы хотели бы использовать%in% оператор.

dih_col <- which(dih_y2$MemeberID %in% memb)

Похожие вопросы