Ошибка в тесте [[1: 3]]: не удалось выполнить рекурсивное индексирование на уровне 2 - PullRequest
1 голос
/ 09 апреля 2019

Я новичок в R и поднабор списка, как показано ниже:

test<-list(c(10,15,20,25),c(11,12,13,14),c(21,22,23,24))

test

[[1]]
[1] 10 15 20 25

[[2]]
[1] 11 12 13 14

[[3]]
[1] 21 22 23 24

Теперь я делаю это

test<-test[[1:3]][1]

показанная ниже ошибка

Ошибка в тесте [[1: 3]]: не удалось выполнить рекурсивное индексирование на уровне 2

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Чтобы выбрать более 1 значения из каждого списка, вы можете использовать sapply / lapply.Например, чтобы выбрать первые 3 значения из списка, вы можете сделать

lapply(test, `[`, 1:3)

#[[1]]
#[1] 10 15 20

#[[2]]
#[1] 11 12 13

#[[3]]
#[1] 21 22 23

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

sapply(test, `[`, 1:3)
#     [,1] [,2] [,3]
#[1,]   10   11   21
#[2,]   15   12   22
#[3,]   20   13   23
0 голосов
/ 09 апреля 2019

Мы можем использовать head с lapply

lapply(test, head, 3)
#[[1]]
#[1] 10 15 20

#[[2]]
#[1] 11 12 13

#[[3]]
#[1] 21 22 23

Или использовать map из purrr

library(purrr)
map(test, head, 3)

Для поднабора значений векторамы можем использовать %in%

a[a %in% 4:7]
0 голосов
/ 09 апреля 2019

Цитата из документации (выделено мной):

Самое важное различие между [, [[ и $ состоит в том, что [ может выбрать более одного элемента, тогда как другие два выбирают один элемент .

Другими словами test[[1 : 3]] не делает того, о чем вы, по-видимому, думаете.Вместо этого он пытается выполнить рекурсивное подмножество, что эквивалентно записи test[[1L]][[2L]][[3L]].

Как предлагается в комментариях, вам нужно выполнить что-то вроде lapply(test, `[[`, 1L) для подмножествакаждый вектор в вашем списке.Чтобы получить результат в виде вектора, а не списка, оберните вызов в unlist или используйте vapply:

vapply(test, `[[`, numeric(1L), 1L)

Вы также можете использовать sapply вместо последнего, но помните, что этофункция возвращает свое возвращаемое значение не так, как это не всегда очевидно, и поэтому подвержено ошибкам.Лучше ограничить его использование интерактивными сессиями.

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