Объединение переменного количества полей в data.frame с использованием mapply

У меня есть фрейм данных со столбцами символов, скажем, tdf <- data.frame(words=letters[1:4], words2=letters[5:8], word3=letters[9:12])

У меня также есть соответствующий вектор, указывающий номер последнего столбца, который будет использоваться для объединения слов в каждой строке, скажем, tcol <- c(3, 1, 1, 2)

Так, например, для четвертой строки вывод должен быть "d h".

Я написал функцию, которая может обрабатывать слияние каждой строки

xyp <- function(x, y) do.call(paste, as.list(x[1:y]))

который работает, как и ожидалось, с циклом for

> y <- character(0)
> for (x in 1:nrow(tdf)) y <- c(y, xyp(tdf[x, ], tcol[x]))
> y
[1] "a e i" "b"     "c"     "d h"  

Я хотел бы применить эту функцию ко фрейму данных без использования цикла for, но вышеприведенная функция, похоже, не работает для этой цели.

> mapply(xyp, tdf, tcol)
  words  words2   word3    <NA> 
"a b c"     "e"     "i"   "a b" 
Warning message:
In mapply(xyp, tdf, tcol) :
  longer argument not a multiple of length of shorter

Я думаю, что понимаю ошибку, но не уверен, что я могу сделать, чтобы исправить это. Какие-либо предложения?


person Ricky    schedule 19.01.2015    source источник
comment
mapply будет работать со столбцами data.frame, а не со строками. Так что вам нужно что-то вроде mapply(xyp, data.frame(t(tdf)), tcol) я думаю. Хотя это ни в коем случае не идеально.   -  person thelatemail    schedule 19.01.2015


Ответы (1)


Как насчет

mapply(function(x, i) paste(x[1:i], collapse=" "), 
    split(as.matrix(tdf),row(tdf)), 
    tcol)

Здесь мы используем split(), чтобы разделить data.frame на список строк, а не список столбцов, как это обычно бывает с data.frame.

person MrFlick    schedule 19.01.2015
comment
Или split(tdf,rownames(tdf)) - они должны быть уникальными в data.frame, поэтому каждая строка будет разделена. - person thelatemail; 19.01.2015