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.

Другими словами: количество строк в результирующей матрице определяется длиной векторов в вашей функции, которую нужно применить.

Другие вопросы по тегам