是否有R函数来限制列表元素的长度?

问题描述 投票:-1回答:2

我现在正努力在R中进行列表操作。我有一个包含大约3000个元素的列表,其中每个元素都是一个字符向量。这些字符向量的长度在7到10之间。

我想以这样一种方式操纵这个列表,那些包含7个以上元素的字符向量仅限于前7个元素 - 因此删除了相应的第8个,第9个和第10个元素/字/数字列表的字符向量。

是否有捷径可寻?我希望你明白我的意思。

提前致谢!

r list
2个回答
1
投票

你需要的是一个辅助功能,它会缩短你的矢量。就像是

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只为您处理迭代限制,并在屏幕上看起来更清洁。


2
投票

你可以使用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"
© www.soinside.com 2019 - 2024. All rights reserved.