Получить попарные суммы нескольких столбцов в кадре данных
У меня есть датафрейм, который выглядит так:
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
разбить столбцы на группы.