Подтвердить что ты не робот

Почему я получаю "предупреждение, что длинная длина объекта не кратная короткой длине объекта"?

У меня есть dataframe 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

Почему?

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

R имеет очень любимую (или ненавижу) функцию, называемую recycling, при которой во многих случаях, если вы пытаетесь сделать что-то, где 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

Ответ 3

У меня была похожая проблема, но она была связана со структурой и классом объекта. Я бы проверил, как dih_y2$MemberID.

Ответ 4

У меня была похожая проблема, и я решил использовать оператор %in% вместо оператора == (равенства):

# %in%

Надеюсь, это поможет.