Dplyr может сделать это довольно хорошо с помощью следующего кода. Строка позволяет вам рассматривать каждую строку отдельно. И команда mutate суммирует любые столбцы, которые вы хотите. na.rm = TRUE обрабатывает проблему, когда у вас есть NA и вы хотите их игнорировать. Как упоминалось в комментарии, если у вас его нет, он даст вам NA, если он находится в любом из суммированных значений.
library(dplyr)
df %>%
rowwise() %>%
mutate(f_new = sum(f,f2, na.rm = TRUE))
arguments
как говорят, подобный Массиву объект. Как Вы уже видели, можно получить доступ к его элементам индексом, но у Вас нет всех методов Массива в Вашем распоряжении. Другими примерами подобных Массиву объектов являются наборы HTML, возвращенные getElementsByTagName () или getElementsByClassName (). jQuery, если Вы когда-либо использовали его, является также подобным Массиву объектом. После запросов некоторых Объектов DOM осмотрите получающийся объект jQuery с Firebug на вкладке DOM, и Вы будете видеть то, что я имею в виду.
Вот мое решение для проблемы Meebo:
function conc(){
if (arguments.length === 0)
return "";
else
return Array.prototype.slice.call(arguments).join(" ");
}
alert(conc("a", "b", "c"));
Array.prototype.slice.call(arguments)
хороший прием должен преобразовать наш arguments
в истинный объект Массива. В Firefox Array.slice.call(arguments)
был бы достаточен, но это не будет работать в IE6 (по крайней мере), таким образом, бывшая версия будет тем, что обычно используется. Кроме того, этот прием не работает на набор, возвращенный методами API DOM в IE6 (по крайней мере); это бросит Ошибку. Между прочим, вместо call
можно было использовать apply
.
Немного объяснения о подобных Массиву объектах. В JavaScript можно использовать в значительной степени что-либо для именования членов объекта, и числа не являются исключением. Таким образом, можно создать объект, который похож на это, которое является совершенно допустимым JavaScript:
var Foo = {
bar : function() {
alert('I am bar');
},
0 : function() {
alert('I am 1');
},
length : 1
}
Вышеупомянутый объект является подобным Массиву объектом по двум причинам:
length
свойство, без которого Вы не можете преобразовать объект в истинный Массив с конструкцией: Array.prototype.slice.call(Foo);
Объект arguments Функционального объекта в значительной степени похож на объект Foo, только что он имеет свое особое назначение.
Объект arguments не является массивом. Это подобно массиву, но не имеет никаких свойств массива кроме длины. Например, это не имеет поп-метода. Однако это может быть преобразовано в действительный массив:
var args = Array.prototype.slice.call(arguments);
Поэтому решение Вашей проблемы довольно просто:
var string = Array.prototype.slice.call(arguments).join("");
BTW: Это дальнейшие состояния:
Объект arguments является локальной переменной, доступной во всех функциях; аргументы как свойство Функции больше не могут использоваться.
Необходимо только использовать arguments
вместо func.arguments
Это работает:
function concatenate(){
return [].join.call(arguments, "");
}
alert(concatenate("one", "two", "three"));
Список аргументов не является подлинным массивом. Я думаю, что можно одолжить методы массива и использовать их на спорах с "вызовом" или "подать заявку".
Вы могли сделать это:
function concatenate() {
if (arguments.length > 1) {
return arguments[0] + concatenate.apply(this, Array.prototype.splice.call(arguments, 1));
}
return arguments[0];
}