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....)), но все равно получил то же самое. Есть ли что-то, чего мне не хватает.

Хотя достаточно просто использовать t(apply(...), я просто хочу знать, что я упустил из виду.

Спасибо, Маниш


person myloginid    schedule 26.11.2015    source источник


Ответы (1)


Просто взгляните на документацию (?apply)

Если каждый вызов FUN возвращает вектор длины n, то apply возвращает массив размерности c(n, dim(X)[MARGIN]), если n > 1.

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

person Patrick Roocks    schedule 26.11.2015
comment
Спасибо. Таким образом, транспонирование необходимо для применения и сопоставления, чтобы сопоставить его с исходным набором данных. - person myloginid; 03.12.2015