2010-08-13 3 views
10

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

+1

так что в конце концов нет прямого способа сопоставления строк? я не могу поверить в это – nicolas

ответ

11

как @greg указывает, вставить() может это сделать. Я подозреваю, что ваш пример является упрощением более общей проблемы. После битвы с этим в прошлом, as illustrated in this previous question, Я закончил использовать пакет 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 не использует переменную «group by» row, созданная @joshua. Как он это делал, именно так я делал это, пока Хэдли не подтолкнул меня к подходу adply(). В вышеупомянутом вопросе.

+0

Спасибо, что указали мне на 'adply' (через Хэдли). ;-) –

+1

Вы можете упростить это с помощью 'transform' или' summaryize': 'adply (x, 1, summary, paste (letter, number, sep =" "))' – JoFrhwld

+0

Awesome, спасибо! Да, мой пример был просто игрушечным примером. Я посмотрел на plyr + reshape некоторое время назад и не понял его = (, но мне обязательно нужно взглянуть еще раз. – Brett

6
paste(x$letter, x$number, sep = "") 
+0

Так я бы это сделал! Это похоже на то, что мы были наставником того же R-мастера ;-) – Vince

1

Я думаю, что вы думали о чем-то вроде этого, но учтите, что 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 
Смежные вопросы