У меня есть данные следующего формата:
gen = function () sample.int(10, replace = TRUE)
x = data.frame(A = gen(), C = gen(), G = gen(), T = gen())
Теперь я хотел бы присоединить к каждой строке общую сумму всех элементов в строке (моя фактическая функция более сложна, но sum
иллюстрирует проблему).
Без dplyr я бы написал
cbind(x, Sum = apply(x, 1, sum))
В результате чего:
A C G T Sum
1 3 1 6 9 19
2 3 4 3 3 13
3 3 1 10 5 19
4 7 2 1 6 16
…
Но сделать это с помощью dplyr кажется на удивление сложным.
Я пробовал
x %>% rowwise() %>% mutate(Sum = sum(A : T))
Но результат — это не сумма столбцов каждой строки, это нечто неожиданное и (для меня) необъяснимое.
я тоже пробовал
x %>% rowwise() %>% mutate(Sum = sum(.))
Но здесь .
— это просто заполнитель для всего x
. Предоставление аргумента без, что неудивительно, также не работает (все результаты 0
). Излишне говорить, что ни один из этих вариантов не работает без rowwise()
.
(На самом деле нет никаких причин обязательно делать это в dplyr, но (а) я хотел бы, чтобы мой код был как можно более унифицированным, и переход между разными API не помогает; и (б) я надеюсь однажды получить автоматическое и бесплатное распараллеливание таких команд в dplyr.)
library(data.table) ; setDT(x)[, Sum := Reduce("+", .SD)][]
быть полезным... - person David Arenburg   schedule 23.01.2015+
— это бинарная функция, принимающая 2 входа, которые затем можно применять/уменьшать несколько раз, в то время какf
из моего ответа принимает сразу весь вектор..) - person talat   schedule 23.01.2015Reduce
. Подождем и посмотрим, что он скажет. - person David Arenburg   schedule 23.01.2015Reduce
— она вычисляет смещение GC из таблицы частот кодонов. Вот реализация: gist.github.com/klmr/4898c3eb1a5216850134 - person Konrad Rudolph   schedule 23.01.2015