Не уверен, правильно ли я понял ваше намерение, но вот как бы вы воспроизвели свои результаты с базой R:
df <- data.frame(
x = c(1:4),
v1 = c(0, 4, 5, 1),
v2 = 1:4,
v3 = (1:4)*5
)
x1 <- colSums(df[df$x > 2, 2:4, drop = FALSE])
x2 <- colSums(df[df$x <= 2, 2:4, drop = FALSE])
Где
df[df$x > 2, 2:4, drop = FALSE]
создастподмножество df
, где строки удовлетворяют df$x > 2
, а столбцы равны 2:4
(имеется в виду второй, третий и четвертый столбец), drop = FALSE
в основном используется для предотвращения упрощения R в некоторых особых случаях colSums
вычисляет сумму по столбцам для подмножества data.frame
Если ваш столбец x
действительно является условием (например, logical vector
), вы можете просто выполнить
x1 <- colSums(df[df$x, 2:4, drop = FALSE])
x2 <- colSums(df[!df$x, 2:4, drop = FALSE])
Обратите внимание, что для получения результатов не требуется цикл, при использовании R вы должны максимально использовать векторизованные функции.
В более общем случае вы можете выполнить такое агрегирование с помощью aggregate
:
aggregate(df[, 2:4], by = list(condition = df$x <= 2), FUN = sum)