Получить попарные суммы нескольких столбцов в кадре данных

У меня есть датафрейм, который выглядит так:

x<-data.frame(a=6, b=5:1, c=7, d=10:6)

> x
  a b c  d
1 6 5 7 10
2 6 4 7  9
3 6 3 7  8
4 6 2 7  7
5 6 1 7  6

Я пытаюсь получить суммы столбцов a & b а также c&d в другом кадре данных, который должен выглядеть следующим образом:

> new
  ab cd
1 11 17
2 10 16
3  9 15
4  8 14
5  7 13

Я попробовал rowSums() функция, но она возвращает сумму всех столбцов в строке, и я попытался rowSums(x[c(1,2), c(3,4)]) но ничего не работает. Пожалуйста помоги!!

2 ответа

Решение

Ты можешь использовать rowSums на подмножестве столбцов.

В качестве фрейма данных:

data.frame(ab = rowSums(x[c("a", "b")]), cd = rowSums(x[c("c", "d")]))
#   ab cd
# 1 11 17
# 2 10 16
# 3  9 15
# 4  8 14
# 5  7 13 

В качестве матрицы:

cbind(ab = rowSums(x[1:2]), cd = rowSums(x[3:4]))

Для более широкого фрейма данных вы также можете использовать sapply над списком подмножеств столбцов.

sapply(list(1:2, 3:4), function(y) rowSums(x[y]))

Для всех парных комбинаций столбцов:

y <- combn(ncol(x), 2L, function(y) rowSums(x[y]))
colnames(y) <- combn(names(x), 2L, paste, collapse = "")
y
#      ab ac ad bc bd cd
# [1,] 11 13 16 12 15 17
# [2,] 10 13 15 11 13 16
# [3,]  9 13 14 10 11 15
# [4,]  8 13 13  9  9 14
# [5,]  7 13 12  8  7 13

Вот еще один вариант:

> sapply(split.default(x, 0:(length(x)-1) %/% 2), rowSums)
      0  1
[1,] 11 17
[2,] 10 16
[3,]  9 15
[4,]  8 14
[5,]  7 13

0:(length(x)-1) %/% 2 шаг создает последовательность групп из 2, которые могут быть использованы с split, Он также будет обрабатывать нечетное количество столбцов (обрабатывая последний столбец как собственную группу). Так как есть другое значение по умолчанию split "метод" для data.frameс разбивкой по строкам, вам нужно указать split.default разбить столбцы на группы.

Другие вопросы по тегам