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