Отображение по строкам кадра данных

Предположим, что у меня есть кадр данных с столбцами 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), но я не могу понять это.

Ответ 1

как указывает @greg, вставить() можно. Я подозреваю, что ваш пример является упрощением более общей проблемы. После борьбы с этим в прошлом как показано в этом предыдущем вопросе, я в конечном итоге использовал пакет plyr для этого типа вещей. plyr делает LOT больше, но для этого легко:

> 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 не использует переменную "group by", созданную @joshua. Как он это делал, именно так я делал это, пока Хэдли не подтолкнул меня к подходу adply(). В вышеупомянутом вопросе.

Ответ 2

paste(x$letter, x$number, sep = "")

Ответ 3

Думаю, вы думали о чем-то подобном, но обратите внимание, что семейство функций 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