Чому в R маскування не фіксує довжину?
> v=c(1,2,3,4,5)
> mask=c(T,T,T,T)
> v[mask]
[1] 1 2 3 4 5
Замість
> v[mask]
[1] 1 2 3 4
Як це зробити?
Відповіді:
3 для відповіді № 1Це пов'язано з переробкою. Якщо вектори мають різну довжину, то коротший вектор рециркулюється в тому порядку, в якому він вказаний.
Порівняйте наступне:
> mask=c(F)
> v[mask]
numeric(0)
> mask=c(T)
> v[mask]
[1] 1 2 3 4 5
> mask=c(T, F, T, F)
> v[mask]
[1] 1 3 5
У першому прикладі F
переробляється 5 разів, тому ніякі значення не друкуються - у другому прикладі відбувається протилежне.
У третьому прикладі 2 і 4 опущені, оскільки вони проіндексовані F
, але маску переробляють, щоб дати a T
для елемента 5
Редагувати Бажаним результатом є 1, 2, 3, 4? Спробуйте маску <- c (T, T, T, T, F)
Це те, що дозволяє заяву подібне
v[v != 5]
Тому що це порівняння переробляється по всьому вектору