отображение по строкам фрейма данных - PullRequest
10 голосов
/ 14 августа 2010

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

Ответы [ 3 ]

11 голосов
/ 14 августа 2010

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

7 голосов
/ 14 августа 2010
paste(x$letter, x$number, sep = "")
1 голос
/ 14 августа 2010

Я думаю, вы думали о чем-то подобном, но учтите, что семейство функций 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...