İç içe listenin ilk öğesini seçin


88

Diyelim ki böyle bir listem var:

x = list(list(1,2), list(3,4), list(5,6))

İç içe geçmiş listenin yalnızca ilk öğelerini içeren bir liste istiyorum. Böyle başka bir listeyi geri döndürerek bunu yapabilirim

x1 = lapply(x, function(l) l[[1]])

Bunun için kısayol notasyonu var mı?

Yanıtlar:


144

Pek bir kısayol değil, ancak bunu yapabilirsiniz:

lapply(x, `[[`, 1)
# [[1]]
# [1] 1
#
# [[2]]
# [1] 3
#
# [[3]]
# [1] 5

1
Daha havalı göründüğüne katılıyorum. Bunu yapmanın daha kısa bir yolu olacağını umuyordum ama daha serin bir yola razı olacağım!
Alex

@ A5C1D2H2I1M1N2O1R2T1 Temizliği ve kısalığı takdir ediyorum, ancak "[[" yi açıklayabilir misiniz? Lapply'de yararlı bir şey bulamadım
Mehrad Mahmoudian

2
@MehradMahmoudian, bakmak için daha iyi bir yer "özüt" olacaktır ( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html ).
A5C1D2H2I1M1N2O1R2T1

44

Başka bir olasılık güzel purrrkitaplığı kullanır :

library(purrr)
map(x, 1)

5
Merak edenler için, bu işe yarıyor çünkü mapsayısal değerleri ayıklama olarak yorumluyor, mesela[[
qwr

12

Örnek listeniz için şunları yapabilirsiniz:

unlist(x)[ c(TRUE,FALSE) ]

ancak bu, her bir alt listenin tam olarak 2 öğeye sahip olmasına bağlıdır.

Farklı sayıda eleman varsa, önce sapplyuzunlukları hesaplamak için bir yapabilir , ardından karşılık gelen 1. eleman konumlarını hesaplayabilir (bakınız cumsum), ardından bu değerleri unlisted listesinden seçebilirsiniz . Ancak o zamana kadar kabul edilen cevap muhtemelen çok daha basittir.

Tüm alt listeler aynı uzunluğa sahipse (ancak 2'den farklı olabilir), aşağıdaki gibi bir şey yapabilirsiniz:

do.call( rbind, x)[,1]

veya bir başkası ortak bir nesneye atılır. Ancak bunun lapplyyaklaşım kadar verimli olacağından şüpheliyim .


3

Biz kullanabilirsiniz pluckgelen rvesther hangi iç içe listeden 1 eleman seçer

rvest::pluck(x, 1)
#[[1]]
#[1] 1

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Bunun, 1. öğeyi ( ) seçen farklı bir sonuç verdiğine dikkat edin pluck.purrrx[[1]]

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

0

Tam olarak kısa bir gösterim değil, ancak bu bir katlama ile de yapılabilir:

Reduce(function(a, b) c(a, b[1]), x, init = c()) 

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.