У меня есть фрейм данных со столбцами символов, скажем, 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
Я думаю, что понимаю ошибку, но не уверен, что я могу сделать, чтобы исправить это. Какие-либо предложения?
mapply
будет работать со столбцами data.frame, а не со строками. Так что вам нужно что-то вродеmapply(xyp, data.frame(t(tdf)), tcol)
я думаю. Хотя это ни в коем случае не идеально. - person thelatemail   schedule 19.01.2015