Мы можем циклически проходить по строкам с помощью apply
(из base R
) проверить, являются ли any
элементов в 'a' или 'b' %in%
группой sort
ed для создания логического индекса и подмножество строк на основе этого
i1 <- apply(my.df, 1, function(x) any(x[1:2] %in% sort(x, decreasing = TRUE)[1:2]))
my.df[i1,]
# a b c d e
#1 6.401462 5.318849 5.373496 5.101140 3.710973
#2 6.715845 4.786936 3.521965 4.264029 4.525138
#3 6.076211 5.356114 5.605134 5.443002 5.296778
#4 7.009623 5.275595 4.801874 4.355892 6.752737
#5 5.002059 6.163398 6.063694 2.409702 6.172111
#6 6.298305 3.291884 5.737053 4.701320 4.752406
#10 5.500374 4.400130 3.980433 6.203259 4.498614
Или используйте max.col
из base R
для создания логического индекса, и это будет намного быстрее и позволит избежать любых преобразований
i1 <- max.col(my.df, "first")
i2 <- max.col(replace(my.df, cbind(seq_len(nrow(my.df)), i1), -Inf), "first")
my.df[(i1 %in% 1:2) | (i2 %in% 1:2), ]
[ 1110] данные my.df <- structure(list(a = c(6.401462, 6.715845, 6.076211, 7.009623,
5.002059, 6.298305, 4.856246, 5.03799, 4.903592, 5.500374), b = c(5.318849,
4.786936, 5.356114, 5.275595, 6.163398, 3.291884, 4.674743, 4.129333,
3.135622, 4.40013), c = c(5.373496, 3.521965, 5.605134, 4.801874,
6.063694, 5.737053, 5.550828, 4.797334, 5.879798, 3.980433),
d = c(5.10114, 4.264029, 5.443002, 4.355892, 2.409702, 4.70132,
7.501786, 5.143915, 5.639893, 6.203259), e = c(3.710973,
4.525138, 5.296778, 6.752737, 6.172111, 4.752406, 5.466611,
5.558161, 4.368915, 4.498614)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
Существенная разница между
и
, на которую никто не указал :
xsl: apply-templates
гораздо богаче и глубже, чем xsl: for-each
, даже
просто потому, что мы не знаем, какой код будет применяться к узлам
выбор - в общем случае этот код будет отличаться для
разные узлы списка узлов .
Кроме того, код, который будет применяться может быть написано так, как шаблоны xsl: apply были написаны и люди, которые не знают оригинального автора .
_2. С другой стороны, использование
никоим образом не вредно, если точно знать, как обрабатывается
.
Проблема в том, что многие новички в XSLT, имеющие опыт в императивном программировании, принимают
в качестве замены «цикла» в своих любимых PL и думают, что это позволяет их выполнить невозможно - например, увеличить счетчик или любую другую модификацию уже определенного
.
Одно обязательное использование
для изменения текущего документа - это часто необходимо для того, чтобы иметь возможность использовать функцию key () в документе, отличную от текущего исходного XML-документа ,
Это использование для каждого
для вызова шаблонов, которое не рекомендуется, а не широкое использование для каждого
как таковое. Даже мюнхенский метод группировки опирается на конструкции xsl: key
с циклами xsl: for-each
.
Идея написания хорошего XSLT состоит в том, что Структура вашего XML должна определять, какие шаблоны сопоставляются, а затем применяются. Поэтому, когда это возможно, используйте apply-templates
для выбора узлов, вместо применения выбора, используя для каждого
.
Шаблоны имеют тенденцию делить код более красиво. Кроме того, циклы for-each страдают от того, что люди часто приходят к ним с мыслью, что они действуют идентично тому, как работают циклы в основных языках программирования.
При использовании apply-templates
, возможно, с режимом
, делает проще включить соответствующие преобразования большего количества видов элементов, которые могут представлять интерес в этом месте.
Например, если у вас был XML, содержащий содержимое библиотеки, и вы продолжаете использовать for-each повсеместно для выбора книг, тогда Вы начнете вести учет DVD, CD, печенья с имбирным орехом и т. д., вам придется изучить все разделы для каждого, чтобы включить в них больше, чем просто книги. Если вы использовали apply-templates, вы можете просто создать новые соответствия для новых элементов.
Быстрый ответ: XSLT в основном функционален по своей природе, а императивные петли не очень функциональны.
В общем, Основанный способ получить лучшее из XSLT - максимально использовать сопоставление с образцом ( xsl: apply-template
, а не циклы, ifs и call-template 1 ).
В конце концов, это все о стиле, и он не будет иметь большого значения для коротких частей XSLT, но его функциональность поможет решить более длинные / сложные проблемы.
1 За исключением случаев создания функций, которые скорее возвращают значения чем модифицировать вывод.