Предположим, что у меня есть кадр данных со столбцами c1..., cn, и функция f, который берет в столбцах этого кадра данных как аргументы. Как я могу применить f к каждой строке кадра данных для получения нового кадра данных?
Например,
x = data.frame(letter=c('a','b','c'), number=c(1,2,3))
# x is
# letter | number
# a | 1
# b | 2
# c | 3
f = function(letter, number) { paste(letter, number, sep='') }
# desired output is
# a1
# b2
# c3
Как я делаю это? Я предполагаю, что это - что-то вроде {s, l, t} применяются (x, f), но я не могу понять это.
как указывает @greg, paste () может это сделать. Я подозреваю, что ваш пример упрощает более общую проблему. После того, как я боролся с этим в прошлом, , как показано в предыдущем вопросе, я в конечном итоге использовал пакет plyr для такого рода вещей. plyr делает НАМНОГО больше, но для этих вещей это просто:
> require(plyr)
> adply(x, 1, function(x) f(x$letter, x$number))
X1 V1
1 1 a1
2 2 b2
3 3 c3
вы захотите переименовать выходные столбцы, я уверен
Итак, пока я набирал это, @joshua показал альтернативный метод, используя ddply
. Разница в моем примере заключается в том, что adply
обрабатывает фрейм входных данных как массив. adply
не использует переменную «группировать по» row
, созданную @joshua. Как он это делал, как и я, пока Хэдли не подсказал мне подход adply ()
. В вышеупомянутом вопросе.
Думаю, вы думали о чем-то подобном, но обратите внимание, что семейство функций apply
не возвращает data.frames. Они также попытаются преобразовать ваш data.frame в матрицу перед применением функции.
apply(x,1,function(x) paste(x,collapse=""))
Возможно, вас больше заинтересует ddply
из пакета plyr
.
> x$row <- 1:NROW(x)
> ddply(x, "row", function(df) paste(df[[1]],df[[2]],sep=""))
row V1
1 1 a1
2 2 b2
3 3 c3