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 [[

我在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

[[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