для каждой строки фрейма данных найдите точки, лежащие в определенном диапазоне - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть фрейм данных с m строками и n столбцами, все значения нормализованы в диапазоне от 0 до 1.

Я бы хотел, чтобы каждая точка определяла n -мерный куб (желательно, чтобы точка была в центре этого куба, в зависимости от того, является ли значение на каждой оси центральным или нет) с каждой стороной, равной 0,2, и посчитайте, сколько точек данных лежит в этом кубе.

Например:

df <- structure(list(x1 = c(0, 0.01, 0.05, 0.07, 0.1, 0.11, 0.16, 0.18, 
0.2, 0.25, 0.5), x2 = c(0.05, 0.3, 0.1, 0.17, 0.38, 0.01, 0.04, 
0.05, 0.11, 0.21, 0.26), x3 = c(0.4, 0.07, 0.09, 0.1, 0.23, 0.4, 
0.2, 0.11, 0.01, 0.34, 0.22)), row.names = c(NA, -11L), class = c("tbl_df", 
"tbl", "data.frame"))

Первая точка не может быть центром куба, потому что ее значения x и y слишком близки к 0. Куб, который он определяет, определяется ограничениями:

x1 >= 0 and x1 <= 0.2
x2 >= 0 and x2 <= 0.2
x3 >= 0.3 and x3 <= 0.5

Таким образом, первый куб содержит только точки (0,05, 0,4) и (0,11, 0,01, 0,4).

Вторая точка определяет куб:

x1 >= 0 and x1 <= 0.2
x2 >= 0.2 and x2 <= 0.4
x3 >= 0 and x3 <= 0.2

и содержит только себя.

Теперь я хотел бы иметь возможность эффективно выполнять эту фильтрацию для произвольных n и m (базовых или dplyr, пожалуйста).

Есть идеи?

1 Ответ

0 голосов
/ 15 ноября 2018

Это смотрит на расстояние между точками и их центрами куба. Любая точка с максимальным расстоянием (в любом измерении), меньшим или равным 0.1, будет находиться внутри этого куба.

lower_edge = 0.5*((df - 0.1) + abs(df - 0.1))
lower_edge = 0.5*((lower_edge + 0.8) - abs(lower_edge - 0.8))
upper_edge = lower_edge + 0.2
cube_center = 0.5*(lower_edge + upper_edge)
m = NROW(df)
n = NCOL(df)
dists = as.matrix(dist(rbind(df, cube_center), method = "maximum"))[(m+1):(2*m), 1:m]
apply(dists, 1, function(x) sum(x <= 0.1))

(я предполагал, что вы не хотите, чтобы у какого-либо куба были точки за пределами [0,1] ^ n)

...