Как заменить первый экземпляр значения в списке - PullRequest
1 голос
/ 03 марта 2020

У меня есть список, в котором я хотел бы заменить первый экземпляр 1 на 'xyz'.

list1 = list(
    x=c(1,2,3,1,2),
    y=c(-1,-2,1,2,1)
)

Мой ожидаемый оп:

list1 = list(
    x=c('xyz',2,3,1,2),
    y=c(-1,-2,'xyz',2,1)
)

я не могу использовать ifelse в качестве его заменил бы весь экземпляр 1.

Я попытался найти индекс. Затем используйте mapply, но он тоже не работает.

list2=lapply(list1, function(x) which(x==1)[1])
mapply(function(x,y){x[y]='xyz'}, list1, list2)

как заменить значения в списке на другой список.

1 Ответ

2 голосов
/ 03 марта 2020

Мы можем использовать match, чтобы вернуть индекс первого совпадения в replace эту позицию с 'xyz'

lapply(list1, function(x) replace(x, match(1, x, nomatch = 0), "xyz"))
#$x
#[1] "xyz" "2"   "3"   "1"   "2"  

#$y
#[1] "-1"  "-2"  "xyz" "2"   "1"  

Поскольку это list из vector с, изменение числового значения c с помощью character изменяет class на character

Если у нас есть два списка, то есть один индексный индекс, используйте Map или mapply

Map(function(x, y) replace(x, y, "xyz"), list1, list2)

Или более компактным способом

Map(`[<-`, list1, list2, "xyz")
#$x
#[1] "xyz" "2"   "3"   "1"   "2"  

#$y
#[1] "-1"  "-2"  "xyz" "2"   "1"  

Если изменяемые значения также будут другими, это может быть vector или list такой же длины, что и другие list с

Map(`[<-`, list1, list2, c("xyz", "zyx"))
...