R 识别子列表中的唯一元素并更改
我在R中有以下“列表”:R 识别子列表中的唯一元素并更改,r,list,R,List,我在R中有以下“列表”: [[1]] [1] 17336 5246 8597 5246 17878 19701 [[2]] [1] 19701 37748 18155 5246 8597 [[3]] [1] 12297 19701 17878 5246 17336 8597 17878 [[4]] [1] 17878 37748 19701 37748 12297 8597 [[5]] [1] 19701 37748 19701 37748 19701 5246 [[
[[1]]
[1] 17336 5246 8597 5246 17878 19701
[[2]]
[1] 19701 37748 18155 5246 8597
[[3]]
[1] 12297 19701 17878 5246 17336 8597 17878
[[4]]
[1] 17878 37748 19701 37748 12297 8597
[[5]]
[1] 19701 37748 19701 37748 19701 5246
[[6]]
[1] 19701 6254 17336 18155 19701 12297
[[7]]
[1] 19701 17878 18155 17878 18155 19701 8597
[[8]]
[1] 8597 18155
[[9]]
[1] 12450 18155 5246 8597 5246 8597
[[10]]
[1] 18155 4105 6254 17878 12297 5246
[[11]]
[1] 8597 12297
[[12]]
[1] 17878 5246 18155 17878 12297 8597
[[13]]
[1] 8597 18155
[[14]]
[1] 5246 37748 18155 12450 18155 8597
[[15]]
[1] 19701 37748 6254 8597 6254 8597 12297
[[16]]
[1] 19701 17878 4105 37748 18155 19701 12450 12297
[[17]]
[1] 6254 12450 37748 17878 5246 17878 8597
[[18]]
[1] 8597 12297 18155 5246 18155 12297
[[19]]
[1] 4105 37748 17878 5246 12450 5246 12450
[[20]]
[1] 17878 20467
[[21]]
[1] 20467
[[22]]
[1] 12450 37748 12450 17878 12450 12297
[[23]]
[1] 6254 17878 12450 12297 5 4105 27697 4105 27697
[[24]]
[1] 4105 37748 17878 20467 12450 17878 27697
[[25]]
[1] 5246 27697 5246 17336 17878 5246 12297 20467
我想找到最快的方法来浏览这个列表,如果有任何元素是一个特定的值,就称之为“参考值”。例如,如果参考值是“5”,那么我想标识元素[[23]]
中有一个“5”。我想做的是改变该元素,使其成为:
[[23]] 4105 27697 4105 27697
一个想法是确定列表中包含您的值的元素。然后将列表子集,并删除这些列表元素中向量的必需元素 这可以在单个
lappy
语句中使用if{}else{}
lst <- list(c(1,2,3),
c(2,3,4),
c(3,4,5),
c(4,5,6))
lst <- lapply(lst, function(x){
if(any(x %in% 5)){
x[-c(1:which(x == 5))]
}else{
x
}
})
# lst
# [[1]]
# [1] 1 2 3
#
# [[2]]
# [1] 2 3 4
#
# [[3]]
# numeric(0)
#
# [[4]]
# [1] 6
我认为for循环是解决这个问题的合理方法:
v <- 5L;
for (li in seq_along(x))
if (!is.na(vi <- match(v,x[[li]])))
x[[li]] <- x[[li]][-1:-vi];
x;
## [[1]]
## [1] 17336 5246 8597 5246 17878 19701
##
## [[2]]
## [1] 19701 37748 18155 5246 8597
##
## [[3]]
## [1] 12297 19701 17878 5246 17336 8597 17878
##
## [[4]]
## [1] 17878 37748 19701 37748 12297 8597
##
## [[5]]
## [1] 19701 37748 19701 37748 19701 5246
##
## [[6]]
## [1] 19701 6254 17336 18155 19701 12297
##
## [[7]]
## [1] 19701 17878 18155 17878 18155 19701 8597
##
## [[8]]
## [1] 8597 18155
##
## [[9]]
## [1] 12450 18155 5246 8597 5246 8597
##
## [[10]]
## [1] 18155 4105 6254 17878 12297 5246
##
## [[11]]
## [1] 8597 12297
##
## [[12]]
## [1] 17878 5246 18155 17878 12297 8597
##
## [[13]]
## [1] 8597 18155
##
## [[14]]
## [1] 5246 37748 18155 12450 18155 8597
##
## [[15]]
## [1] 19701 37748 6254 8597 6254 8597 12297
##
## [[16]]
## [1] 19701 17878 4105 37748 18155 19701 12450 12297
##
## [[17]]
## [1] 6254 12450 37748 17878 5246 17878 8597
##
## [[18]]
## [1] 8597 12297 18155 5246 18155 12297
##
## [[19]]
## [1] 4105 37748 17878 5246 12450 5246 12450
##
## [[20]]
## [1] 17878 20467
##
## [[21]]
## [1] 20467
##
## [[22]]
## [1] 12450 37748 12450 17878 12450 12297
##
## [[23]]
## [1] 4105 27697 4105 27697
##
## [[24]]
## [1] 4105 37748 17878 20467 12450 17878 27697
##
## [[25]]
## [1] 5246 27697 5246 17336 17878 5246 12297 20467
##
v使用@symbolXau的数据:
lapply(lst, function(x) tail(x, -Position(isTRUE, x==5, nomatch=-Inf)) )
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 2 3 4
#
#[[3]]
#numeric(0)
#
#[[4]]
#[1] 6
要解释其工作原理:
1) 中间位置
部分仅返回第一次检测到5
时索引的负数,即:
sapply(lst, function(x) -Position(isTRUE, x==5, nomatch=-Inf) )
#[1] Inf Inf -3 -2
2) tail(x,-n)
只从向量中删除第一个n
值。使用Inf
运行时,不会删除任何内容。因此,当未找到5
时,为什么在实例中使用Inf
。是否要从列表元素中删除“5”?@symbolxau删除5和任何前面的值,只保留后面的值:for(沿(x)的顺序中的li)if(any(x[[li]==v)]x[[li]]也许在any
中加入一个na.rm=TRUE
是个好主意。介意加入bgoldst2={for(liin seq_沿着(x))如果(any(x[[li]]==v,na.rm=TRUE)]x[[li]]@Jota-我看到了你的评论,给了你荣誉:)
lapply(lst, function(x) tail(x, -Position(isTRUE, x==5, nomatch=-Inf)) )
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 2 3 4
#
#[[3]]
#numeric(0)
#
#[[4]]
#[1] 6
sapply(lst, function(x) -Position(isTRUE, x==5, nomatch=-Inf) )
#[1] Inf Inf -3 -2