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

时间:2019-03-28 11:09:42

标签: r list

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

我想以这样一种方式来操作该列表,即那些包含7个以上元素的字符向量仅限于前7个元素-因此删除了第8、9和10个元素/单词/数字列表中各个字符向量的符号。

有没有简单的方法可以做到这一点?我希望你明白我的意思。

提前谢谢!

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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)

奖金

您在对Sonny的回答的评论中说,您不确定lapply的工作方式。在lapply的概念上,它是for循环的包装。等效的for循环将是

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

char_list

lapply可以为您处理迭代限制,并且在屏幕上看起来更干净。