我现在正努力在R中进行列表操作。我有一个包含大约3000个元素的列表,其中每个元素都是一个字符向量。这些字符向量的长度在7到10之间。
我想以这样一种方式操纵这个列表,那些包含7个以上元素的字符向量仅限于前7个元素 - 因此删除了相应的第8个,第9个和第10个元素/字/数字列表的字符向量。
是否有捷径可寻?我希望你明白我的意思。
提前致谢!
你需要的是一个辅助功能,它会缩短你的矢量。就像是
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
只为您处理迭代限制,并在屏幕上看起来更清洁。
你可以使用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"