В R у меня есть вектор, скажем, vec = c(1,2,...10).
Что я хочу сделать, так это пройтись по вектору, и для каждого элемента применить функцию, которая снова включает в себя цикл по вектору. Я могу сделать это с помощью циклов for, но я хочу сделать это со встроенными функциями.
Для конкретного примера я хотел бы взять каждый элемент вектора и взять сумму чисел, которые больше, чем текущий элемент, на который я смотрю. Тогда я получу новый вектор той же длины.
vec=c(1,2,3,4,5,6,7,8,9,10)
newvec=c()
for (i in 1:10){
x=vec[i]
sum=0
for (j in 1:10){
if (vec[j]>x){
sum=sum+vec[j]
}}
newvec=c(newvec,sum)}
newvec
Каков наилучший способ добиться этого с помощью встроенных функций, надеюсь, это применимо даже в более общем смысле, чем в этом примере (например, сравниваются несколько условий, а не только vec[j]>x)? Приветствуется любая помощь!
С sapply
. Для каждого элемента vec
(скажем, x
) он возвращает sum
значений vec
, которые больше x
.
sapply(vec, \(x) sum(vec[vec > x]))
# [1] 54 52 49 45 40 34 27 19 10 0
Вероятно, для этого вы можете использовать ifelse
, встроенную версию if/else
. Вы можете изменить функцию внутри sapply
по желанию (начиная с \(x)
).
@user352188 user352188 \(x)
в ответе Маэля определяет анонимную функцию. эта функция может быть настолько сложной или простой, насколько вам нужно. Подходы для дополнительных условий могут быть if...else
конструкциями, ifelse()
однострочной версией этой конструкции, switch()
оператором, если у вас есть больше условий и т. д.
Спасибо! Что делать, если есть дополнительные условия; добавить одно значение vec>x , другое, например, если vec<x ?