Как правильно использовать `[` с применением (l | s) для выбора определенного столбца из списка матриц? - PullRequest
28 голосов
/ 29 октября 2010

Рассмотрим следующую ситуацию, когда у меня есть список из n матриц (это просто фиктивные данные в примере ниже) в объекте myList

mat <- matrix(1:12, ncol = 3)
myList <- list(mat1 = mat, mat2 = mat, mat3 = mat, mat4 = mat)

Я хочу выбрать конкретный столбец из каждой матрицы и что-то с ним сделать. Это даст мне первый столбец каждой матрицы и вернет его в виде матрицы (lapply() даст мне список либо в порядке).

sapply(myList, function(x) x[, 1])

Что я не могу сделать, так это использовать [ напрямую как функцию в моих заклинаниях sapply() или lapply(). ?'[' говорит мне, что мне нужно предоставить аргумент j в качестве идентификатора столбца. Так что я делаю не так, что это не работает?

> lapply(myList, `[`, j = 1)
$mat1
[1] 1

$mat2
[1] 1

$mat3
[1] 1

$mat4
[1] 1

Где бы я ожидал этого:

$mat1
[1] 1 2 3 4

$mat2
[1] 1 2 3 4

$mat3
[1] 1 2 3 4

$mat4
[1] 1 2 3 4

Я подозреваю, что у меня неправильный [ метод, но я не могу понять, почему? Мысли?

Ответы [ 3 ]

23 голосов
/ 29 октября 2010

Я думаю, что вы получаете форму с 1 аргументом [.Если вы делаете lapply(myList, &#96;[&#96;, i =, j = 1), это работает.

13 голосов
/ 29 октября 2010

После двух пинтов лучшего британского эля и небольшого размышления я понимаю, что эта версия будет работать:

lapply(myList, `[`, , 1)

т.е. не называйте ничего и относитесь к этому, как я сделал mat[ ,1]. До сих пор не понимаю, почему имя j не работает ...

... на самом деле, прочитав ?'[' более внимательно, я замечаю следующий раздел:

Argument matching:

     Note that these operations do not match their index arguments in
     the standard way: argument names are ignored and positional
     matching only is used.  So ‘m[j=2,i=1]’ is equivalent to ‘m[2,1]’
     and *not* to ‘m[1,2]’.

И это объясняет мое затруднение выше. Да, за то, что прочитал документацию.

4 голосов
/ 29 октября 2010

Это потому, что [ - это функция .Primitive.У него нет аргумента j.И нет [.matrix метода.

> `[`
.Primitive("[")
> args(`[`)
NULL
> methods(`[`)
 [1] [.acf*            [.AsIs            [.bibentry*       [.data.frame     
 [5] [.Date            [.difftime        [.factor          [.formula*       
 [9] [.getAnywhere*    [.hexmode         [.listof          [.noquote        
[13] [.numeric_version [.octmode         [.person*         [.POSIXct        
[17] [.POSIXlt         [.raster*         [.roman*          [.SavedPlots*    
[21] [.simple.list     [.terms*          [.ts*             [.tskernel* 

Хотя на самом деле возникает вопрос, как [ отправляется на матричные объекты ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...