根据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
将函数应用于 dat
和 delete_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"
我有两个列表,一个包含不同长度的字符值 (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
将函数应用于 dat
和 delete_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"