我现在正在R中进行列表操作。我有一个包含约3000个元素的列表,其中每个元素都是一个字符向量。这些字符向量的长度在7到10之间。
我想以这样一种方式来操作该列表,即那些包含7个以上元素的字符向量仅限于前7个元素-因此删除了第8、9和10个元素/单词/数字列表中各个字符向量的符号。
有没有简单的方法可以做到这一点?我希望你明白我的意思。
提前谢谢!
答案 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
可以为您处理迭代限制,并且在屏幕上看起来更干净。