Подмножество списка, который является выводом функции, не объявляя вывод как переменную - PullRequest
2 голосов
/ 26 апреля 2020

Из библиотеки gtools возьмите combinations(5,2). Это дает следующий вывод:

> combinations(5,2)
      [,1] [,2]
 [1,]    1    2
 [2,]    1    3
 [3,]    1    4
 [4,]    1    5
 [5,]    2    3
 [6,]    2    4
 [7,]    2    5
 [8,]    3    4
 [9,]    3    5
[10,]    4    5

Без объявления этого вывода в качестве переменной , я буду sh, чтобы удалить все элементы из этого вывода, которые имеют значение 1 в первый столбец и вернуть полученный список в том же формате, что и исходный вывод.

До сих пор я пробовал:

  • Формулировки, аналогичные тем, которые предложены в this ответ. Например, (combinations(5,2))[(combinations(5,2))[,1]>1]. Это дает то, что напоминает желаемые числа, но вывод не является массивом. Кажется, что это одномерный вектор чисел.
  • Удаление нежелательных выходов через знак минус. Например, (combinations(5,2))[-combinations(5,2)[,1]>1]. Это всегда возвращает integer(0).
  • Функция subset. Это всегда возвращает ошибки для меня, обычно жалуясь, что один из моих аргументов не логичен. Я пытался исправить это с помощью which, но это не помогло.

Какие у меня есть другие варианты?

Ответы [ 3 ]

2 голосов
/ 27 апреля 2020

Если вы используете magrittr, вы можете использовать

combinations(5,2) %>% .[.[,1]>1,]

, что избавляет от необходимости пересчитывать дорогой combinations расчет дважды.

Но зачем так усердно работать, чтобы избежать переменного ? В итоге вы удваиваете используемую память и вычисляете время. Вы тоже против написания функции? Почему бы не

colFilter <- function(x, col, fun) x[fun(x[,col]),]

И тогда вы можете сделать

colFilter(combinations(5,2), 1, function(x) x>1)

, который был бы гораздо более эффективным.

В противном случае функция трубопровода была бы

* 1017. *

Это позволяет вам написать выражение, в котором значение, на которое вы передаете, может указываться . в выражении, которое вы будете sh оценивать.

withX(combinations(5,2), .[.[,1]>1,])
1 голос
/ 26 апреля 2020

Это работает:

combinations(5, 2)[combinations(5, 2)[, 1] > 1, ]
#>      [,1] [,2]
#> [1,]    2    3
#> [2,]    2    4
#> [3,]    2    5
#> [4,]    3    4
#> [5,]    3    5
#> [6,]    4    5

, хотя имейте в виду, что он выполняет вычисление combinations дважды.

Разница между этой версией и вашей первой попыткой - запятая после "> 1"

0 голосов
/ 26 апреля 2020

Вы можете сделать это.

combinations(5,2)[combinations(5,2)[,1]!=1,]

Выглядит не очень хорошо, но работает.

...