r - Использование.I для возврата номеров строк с помощью пакета data.table




(2)

Кто-нибудь, пожалуйста, объясните мне правильное использование .I для возврата номеров строк таблицы данных.

У меня есть такие данные:

require(data.table)
DT <- data.table(X=c(5, 15, 20, 25, 30))
DT
#     X
# 1:  5
# 2: 15
# 3: 20
# 4: 25
# 5: 30

Я хочу вернуть вектор индексов строк, где условие в i равно TRUE , например, какие строки имеют X больше 20.

DT[X > 20]
# rows 4 & 5 are greater than 20

Чтобы получить индексы, я попытался:

DT[X > 20, .I]
# [1] 1 2 

... но ясно, что я делаю это неправильно, потому что это просто возвращает вектор, содержащий 1, к числу возвращенных строк. (Который, по моему мнению, был в значительной степени тем, для чего он был?).

Извините, если это кажется чрезвычайно простым, но все, что я смог найти в документации data.table, это WHAT .I и .N , а не КАК использовать их.


Извините, если это кажется чрезвычайно простым, но все, что я смог найти в документации data.table, это WHAT .I и .N, а не КАК использовать их.

Сначала давайте проверим документацию. Я набрал ?data.table и искал .I . Вот что там:

Дополнительно: при группировке символы символов .SD, .BY, .N, .I и .GRP могут использоваться в выражении j, определяемом следующим образом.

.I - целочисленный вектор, равный seq_len (nrow (x)). При группировке он удерживает для каждого элемента в группе местоположение строки в x. Это полезно для подмножества в j; например DT [, .I [which.max (somecol)], by = grp].

Акцент, добавленный мной здесь. Первоначальное намерение состояло в том, что я должен использоваться во время группировки. Обратите внимание, что на самом деле есть пример в документации по использованию HOW.

Вы не группируете.

Тем не менее, то, что вы пробовали, было разумным. Со временем эти символы стали использоваться, когда они не группируются. Может быть, случай. .I должен вернуть то, что вы ожидали. Я вижу, что использование .I в j вместе с i и by может быть полезно. В настоящее время. .I кажется, что не полезно, когда i присутствую, как вы указали.

Использование функции which() хорошо, но может обойти оптимизацию в i (для which() требуется длинный логический ввод, который должен быть создан и передан ему). Использование аргумента which=TRUE хорош, но затем просто возвращает номера строк (вы не могли тогда что-то делать с этими номерами строк в j по группе).

Запрос функции #1494 поданный для обсуждения изменений. .I работаю так, как вы ожидали. Документация содержит слова «местоположение строки в x», которое подразумевало бы то, что вы ожидали, так как x - это вся таблица данных.


Если все, что вам нужно, это номера строк, а не сами строки, тогда используйте значение which = TRUE , а не .I .

DT[X > 20, which = TRUE]
# [1] 4 5

Таким образом, вы получаете преимущества оптимизации i , например быстрые соединения или использование автоматического индекса. The which = TRUE заставляет его возвращаться с ранних номеров.

Вот ручная запись для аргумента внутри data.table:

TRUE возвращает номера строк x которые соответствуют i . Если NA , возвращает номера строк i , которые не совпадают с x . По умолчанию возвращаются FALSE и возвращаемые строки в x .

Объяснение:

Обратите внимание, что существует определенная связь между .I и аргументом i = .. в DT[i = .., j = .., by = ..] А именно: .I - вектор номеров строк в поднаборной таблице.

### Lets create some sample data
set.seed(1)
LL <- sample(LETTERS[1:5], 20, TRUE)
DT <- data.table(X=LL)

посмотрите на разницу между подмножеством всей таблицы и подмножеством .I

DT[X == "B", .I]
# [1] 1 2 3 4 5 6

DT[  , .I[X == "B"] ]
# [1]  1  2  5 11 14 19






data.table