Как насчет использования Reduce
с dplyr::coalesce
?
library(dplyr)
df <- data.frame(grp_A = c(13, NA, NA, NA, NA, 20, NA),
grp_B = c(NA, 59, 66, NA, NA, NA, NA),
grp_C = c(NA, NA, NA, 23, 42, NA, NA))
mutate(df, value = Reduce(coalesce, df))
Результат:
grp_A grp_B grp_C value
1 13 NA NA 13
2 NA 59 NA 59
3 NA 66 NA 66
4 NA NA 23 23
5 NA NA 42 42
6 20 NA NA 20
7 NA NA NA NA
Другой вариант - использовать rowSums
:
df$value <- rowSums(df, na.rm = T)
df[df$value == 0, ] <- NA
[ 1111] Кроме того, с точки зрения производительности, базовое Reduce
решение представляется наиболее эффективным:
microbenchmark::microbenchmark(
Reduce = Reduce(coalesce, df),
purrr = purrr::reduce(df, coalesce),
rowMeans = rowMeans(df,na.rm=T),
rowSums = rowSums(df, na.rm = T),
cbind = df[cbind(1:nrow(df), max.col(!is.na(df)))],
times = 1000
)
Unit: microseconds
expr min lq mean median uq max neval cld
Reduce 83.507 107.2095 145.4134 121.4320 137.8410 12190.845 1000 a
purrr 205.667 269.1175 357.5908 304.8540 342.4135 24316.051 1000 b
rowMeans 129.089 159.3555 196.1438 174.4890 194.9095 5481.523 1000 a
rowSums 129.454 157.1680 197.2731 173.5775 196.0035 7685.874 1000 a
cbind 267.294 331.8385 408.3179 368.4860 410.2400 4533.050 1000 b
Текст, который Вы хотите здесь, Абстрактная алгебра, Вычислительный Подход Chuck Sims. Автор рекомендует использовать язык программирования APL . Книга распродана, но можно, вероятно, найти его в библиотеке.
существует также Компьютерная Система Алгебры GAP , который является забавой использовать для теории групп.
Усовершенствованные ресурсы:
Магма : довольно сложный CAS, который может обработать широкий спектр понятий от абстрактной алгебры.
Macaulay 2: используемый для изучения полиномиальных колец, особенно основания GrГ¶bner .
ИСКЛЮЧИТЕЛЬНЫЙ : используемый для изучения полиномиальных колец.
факт ключа А в изучении теории групп - то, что каждая группа изоморфна к группа подстановок регулярным действием. Таким образом ключ к пониманию теории групп должен понять группы подстановок.
Наконец, любой язык, который поддерживает определение Ваших собственных объектов и определение бинарного оператора на двух экземплярах объекта, будет поддерживать изучение теории посредством программирования.
Возможно, немного отличающееся взятие по Вашему вопросу, но все еще... Функциональный язык Haskell использует понятия от алгебры (особенно теория категорий), такие как монады, моноиды, стрелки и этажерка.
Используя typeclasses Haskell, Вы могли также превратить любой объект в группу или кольцо, например, просто путем определения операций (операторы) на них. Гарантия, что операции Вы определяете на самом деле, соответствует аксиомам группы/кольца, была бы Ваша ответственность, как бы то ни было.
Mathematica имеет много полезных функций для контакта с понятиями в абстрактной алгебре. К сожалению, это - собственное программное обеспечение и очень дорогой. Sage является свободной альтернативой, которая также имеет довольно хороший репертуар функций абстрактной алгебры, хотя я не использовал его как экстенсивно, таким образом, я не могу прокомментировать намного больше его.
Любой язык с целыми числами без знака фиксированного размера (например, эти unsigned int
тип в C) является примером такой реализации. Дополнение с неподписанными значениями является по существу тем же как дополнением по <глотку> Z 2 32 глоток> (т.е. целые числа по модулю 2 <глоток> 32 глоток>), о котором Вы, вероятно, узнаете в Вашем классе абстрактной алгебры.
Модульное дополнение по такой группе не ужасно интересно, все же. Более интересный могло бы быть модульное дополнение по группе размера N, где N имеет простые множители всего кроме 2, или размер P, где P является началом. Для экспериментирования с такими группами Вам, вероятно, придется реализовать такие арифметические операции самим (это не твердо). Языки с перегрузкой оператора могут сделать реализацию намного более удобной для использования.
Используйте язык, который имеет большую часть смысла Вам. Абстрактная алгебра содержит большое управление символом (продвижение символа) и перезапись, скромный объем индукции и изрядное количество скуки. Мне, который походит на логическое или функциональное программирование; Epigram и Agda делают немного это, и Haskell делает в некоторой степени (хотя я не соглашаюсь, что моноид корректен, mzero и mappend хорошо, mconcat: плохо). Для абстрактной алгебры лучший язык программирования является ноутбуком Определения и бумагой тонн. Хотя этот становится довольно тайным в эти дни.
В том же духе к ответу Greg, у групп есть хорошее представление в форме умножение матриц, таким образом, Вы часто видите примеры, сделанные с помощью matlab или подобные инструменты...
Хм ... извините, но я не думаю, что эффективно выучить какой-то новый модный язык программирования по порядку чтобы помочь вам выучить абстрактную алгебру.
Да, Хаскелеры любят говорить о теории категорий, но это не очень хорошая отправная точка.
GAP and co. используются, чтобы помочь взрослым групповым теоретикам найти новых «монстров» - они плохие инструменты для изучения теории групп.
Может быть, вы можете взглянуть на это: http://freecomputerbooks.com/mathAlgebraBooks.html - вокруг этой темы много бесплатных книг.
Если вы играете с группами, вы можете визуализировать их с помощью Group explorer .