Как получить позицию первого TRUE в любой строке или столбце фрейма данных в R?

avatar
Alvaro Morales
9 августа 2021 в 02:01
71
1
-1

У меня есть эта табличка/фрейм данных:

library(tidyverse)

df <- tibble(
  a = c(FALSE, FALSE, FALSE, TRUE),
  b = c(FALSE, TRUE, TRUE, FALSE),
  c = c(FALSE, FALSE, TRUE, FALSE)
)

# A tibble: 4 x 3
  a     b     c    
  <lgl> <lgl> <lgl>
1 FALSE FALSE FALSE
2 FALSE TRUE  FALSE
3 FALSE TRUE  TRUE 
4 TRUE FALSE FALSE

под первым ИСТИНА я имею в виду:

позиции:

enter image description here

расстояния:

# A tibble: 4 x 3
      a     b     c
  <dbl> <dbl> <dbl>
1     0     1     2
2     1     2     3
3     2     3     4
4     3     4     5

Расстояние от c(2, 2) до c(1,1) составляет два шага (один влево и один вверх) (расстояние = 2), поэтому каждая ячейка имеет расстояние от c(1, 1). Первое значение ИСТИНА с минимальным расстоянием является первым значением ИСТИНА, поэтому желаемый результат в этом примере — c(2,2); когда у вас есть две или более ячеек, сначала TRUE с равным расстоянием, вы помещаете их в список в результате, подобном этому list(c(1, 2), c(4, 3)). Я понял, что это называется манхэттенским расстоянием.

Источник
Ronak Shah
9 августа 2021 в 02:11
1

Вы имеете в виду, что желаемый результат будет list(c(2, 3), c(3, 2)) для второго случая. Разве первая позиция TRUE не должна всегда быть только 1 позицией? Какова логика возврата c(2, 3) и c(3, 2)?

Alvaro Morales
9 августа 2021 в 03:04
0

Они находятся на одинаковом расстоянии от c(1,1)

Alvaro Morales
9 августа 2021 в 03:05
0

В первом случае c(2,2) является ближайшим из c(1,1)

Ronak Shah
9 августа 2021 в 03:10
0

Как рассчитать расстояние? Как узнать, какой из них ближе?

dcarlson
9 августа 2021 в 03:11
0

Но c(1, 3) является «первым ИСТИННЫМ в любой строке или столбце» для строки 1 и для столбца 3; c(2, 2) первое значение TRUE для строки 2 и столбца 2; и c(3, 1) является первым TRUE для строки 3 и столбца.

dcarlson
9 августа 2021 в 03:17
0

Или вы имеете в виду ближайший к c (1, 1) как на минимальном расстоянии: sqrt((row(df) - 1)^2 + (col(df) - 1)^2).

Alvaro Morales
9 августа 2021 в 03:21
0

Мой плохой, я не объяснил себя лучше, я обновил пост. Да @dcarlson

dcarlson
9 августа 2021 в 03:30
0

НО c(3, 1 ) тоже 2 шага, всего 2 шага по горизонтали. Однако это всего 1,4 единицы, тогда как с (3, 1) составляет 2 единицы.

Alvaro Morales
9 августа 2021 в 03:35
0

c(3, 1) равно FALSE, поэтому не считается.

Adam Sampson
9 августа 2021 в 03:55
0

Путаница здесь заключается в том, хотите ли вы ТОЛЬКО расстояние от c (1,1) до ближайшего TRUE или вам нужен алгоритм, который определяет расстояние от любой позиции до ближайшего TRUE.

Adam Sampson
9 августа 2021 в 03:56
0

Кроме того, как правило, этот сайт не предназначен для того, чтобы придумывать для вас алгоритмы. Для этого есть другие сайты. См. справку о том, что считается хорошим вопросом для этого сайта.

Ответы (1)

avatar
dcarlson
9 августа 2021 в 03:35
0

Попробуйте это

dst <- (row(df) - 1) + (col(df) - 1)
dst[as.matrix(!df)] <- NA
which(dst==min(dst, na.rm=TRUE), arr.ind=TRUE)
#      row col
# [1,]   2   2

Результаты будут матрицей с 1 или более строками. При необходимости вы можете преобразовать его в список.