Почему отрезание интервала столбца R не работает, если интервал имеет длину 1? - PullRequest
2 голосов
/ 31 марта 2020

Вчера я запускал некоторый код, который включал разбиение матрицы на интервалы столбцов. То есть, учитывая nxp матрицу A и последовательность точек разрыва, я нарезал A, используя a для l oop. Первая часть была A [, 1: break_points [1]]. Второй кусок был A [, break_points [1] +1: break_points [2]]. Третий кусок был A [, break_points [2] +1: break_points [3]], et c.

К сожалению, выполнение завершилось ошибкой. Немного покопавшись, я обнаружил root проблемы: один из интервалов столбца был длиной 1. Как оказалось, A [, 3679: 3679] не работает должным образом. В частности,

A0 <- A[,3679:3680]
ncol(A0)
> 2

, но

A0 <- A[,3679:3679]
ncol(A0)
> NULL

Я знаю, как это исправить: просто создайте исключение if-else для случая, когда break_points [i + 1] - break_points [i ] = 1. Но мне любопытно, почему R по-разному относится к срезам столбцов длины 1.

1 Ответ

1 голос
/ 31 марта 2020

При поднаборе матрицы R по умолчанию преобразует срезы длиной 1 в вектор. Чтобы предотвратить это, вы должны или должны добавить аргумент drop = FALSE, например, A[ ,3679:3679, drop = FALSE] даст вам матрицу из одного столбца вместо вектора. Обсуждение простого подбора и сохранения подмножества можно найти в книге Хэдли Уикхема Advanced R .

...