根据R中另一个列表中的数字删除列表中的特定项目

Delete specific items in a list based on numbers in another list in R

我有两个列表,一个包含不同长度的字符值 (dat),另一个在每个元素中包含一个数值 (delete_n)。

dat <- list(c("Apple", "Pear"), c("Red", "Blue", "Green"), c("Toyota", "Mazda"))
delete_n <- list(0, 2, 1)

"delete_n" 中的元素与 "dat" 中的元素配对(delete_n[1] 与 dat[1] 配对,依此类推)。 "delete_n" 数字 (0,2,1) 告诉我需要从每一行末尾删除的每个元素中有多少个特定列表项。

根据示例,我正在寻找一种解决方案,它将从 dat[1] 中删除 0 个项目,从 dat[2] 和 [=25= 中删除 "Blue" 和 "Green" ] 来自数据[3].

我尝试先匹配元素编号,然后通过以下变体来识别元素列表索引,但没有成功。 mapply 可能更合适,但我还是不清楚如何编写 function() 部分。

lapply(seq_along(dat), function(x) {
    sapply(seq_along(delete_n), function(y) {
        x[y]
    })
})
mapply(function (x, n) {
    # x is an element of dat; n is an element of delete_n
    x[seq_len(length(x)-n)]
}, dat, delete_n)

解释:

mapply 将函数应用于 datdelete_n 的每个元素,合在一起(因此所有第一元素、所有第二元素等)。

seq_len(i) 生成向量 1:i,因此 seq_len(length(x)-n) 选择 x.

中除最后 n 个元素之外的所有元素

只是因为我不能不让 head 工作就让它过去:
如果您将 delete_n 更改为向量 c(0,2,1)(这很容易,因为每个对应的 dat 列表项只有一个值),您可以执行以下操作:

Map(head, dat, n=-replace(delete_n, delete_n==0, -Inf))

我喜欢 mapply 方法,但这对我来说似乎很自然(无论如何都以负零失败)。

 mapply( head, dat, sapply(dat, length )- unlist(delete_n ))
#-------
[[1]]
[1] "Apple" "Pear" 

[[2]]
[1] "Red"

[[3]]
[1] "Toyota"