R - применить / mapply - требуется транспонирование
Я определил функцию R, которая принимает 2 строки в качестве входных данных и возвращает 10 столбцов в качестве выходных данных. С примером функции, чтобы объяснить проблему -
func.ret.10.cols = function(x,y) {
# process strings ... yada yada
.....
# process strings ... yada yada
return ( cbind(1,2,3,4,5,6,7,8,9,10))
}
Тестирование с помощью фрейма данных -
> df1
V1 V2
1 741 zulu zulu street 71 15 41 510741 741 14 21 zulu zulu street 71 510742
2 741 zulu zulu street 71 15 41 510741 741 14 21 zulu zulu street 71 510742
> str(df1)
'data.frame': 2 obs. of 2 variables:
$ V1: chr "741 zulu zulu street 71 15 41 510741" "741 zulu zulu street 71 15 41 510741"
$ V2: chr "741 14 21 zulu zulu street 71 510742" "741 14 21 zulu zulu street 71 510742"
>
Теперь, когда я вызываю эту функцию, я ожидаю получить вывод из 10 столбцов и 2 строк. Однако я всегда получаю 2 столбца и 10 строк.
> apply(df1[,c('V1','V2')], 1, function(x) func.ret.10.cols(x[1],x[2]))
1 2
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
[7,] 7 7
[8,] 8 8
[9,] 9 9
[10,] 10 10
> mapply(function(x,y) func.ret.10.cols(x,y), df1$V1, df1$V2)
741 zulu zulu street 71 15 41 510741 741 zulu zulu street 71 15 41 510741
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 4 4
[5,] 5 5
[6,] 6 6
[7,] 7 7
[8,] 8 8
[9,] 9 9
[10,] 10 10
Я также пытался с as.data.frame(cbind(1,2,3....)), но все равно получил то же самое. Есть что-то, чего мне не хватает.
Хотя его достаточно легко использовать в (применить (...), я просто хочу знать, что я упустил.
Спасибо Маниш
1 ответ
Просто взгляните на документацию (?apply
)
Если каждый вызов FUN возвращает вектор длины n, то метод apply возвращает массив измерения c(n, dim(X)[MARGIN]), если n > 1.
Другими словами: количество строк в результирующей матрице определяется длиной векторов в вашей функции, которую нужно применить.