Существует ли функция R для ограничения длины элементов списка? - PullRequest
0 голосов
/ 28 марта 2019

Я борюсь со списком манипуляций в R прямо сейчас. У меня есть список, содержащий около 3000 элементов, где каждый элемент является символьным вектором. Длина этих символьных векторов составляет от 7 до 10.

Я хотел бы манипулировать этим списком таким образом, чтобы те векторы символов, которые содержат более 7 элементов, были ограничены только первыми 7 элементами - следовательно, отбрасывать 8-й, 9-й и 10-й элемент / слово / число соответствующего символьного вектора списка.

Есть ли простой способ сделать это? Я надеюсь, вы понимаете, о чем я.

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 28 марта 2019

Вы можете использовать lapply, как показано ниже:

mylist <- list(a = c("a", "b"),
               b = c("a", "b", "c"))
mylist

$a
[1] "a" "b"

$b
[1] "a" "b" "c"

mylist2 <- lapply(mylist, function(x) {
      x[1:min(length(x), 2)]
    })
mylist2

$a
[1] "a" "b"

$b
[1] "a" "b"
1 голос
/ 28 марта 2019

Вам нужна вспомогательная функция, которая сократит ваш вектор. Что-то вроде

shorten_vector <- function(y, max_length = 7){
  # NOTE: assumes that there are at least 7 elements in the vector.
  y[seq_len(max_length)]
}

затем вы можете сократить векторы в вашем списке с помощью

lapply(your_list, shorten_vector)

Или лучше

lapply(your_list, head, 7) # Thanks Moody

Воспроизводимый пример

# Make an object for an example.  A list of length 15
# where each element is a character vector between length 7 and 10

random_length <- sample(7:10, 15, replace = TRUE)

char_list <- 
  lapply(random_length,
         function(x){
           letters[seq_len(x)]
         })

# utility function
shorten_vector <- function(y, max_length = 7){
  y[seq_len(max_length)]
}


lapply(char_list,
       shorten_vector)

Бонус

Вы сказали в комментарии к ответу Сонни, что не совсем уверены, как работает lapply. По своей сути, lapply - это обертка вокруг цикла for. Эквивалентный цикл for будет

for(i in seq_along(char_list)){
  char_list[[i]] <- shorten_vector(char_list[[i]])
}

char_list

lapply просто обрабатывает ограничения итерации для вас и выглядит немного чище на экране.

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