Chọn phần tử đầu tiên của danh sách lồng nhau


86

Giả sử tôi có một danh sách như sau:

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

Tôi muốn một danh sách chỉ chứa các phần tử đầu tiên của danh sách lồng nhau. Tôi có thể làm điều này bằng cách trả lại một danh sách khác như vậy

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

Có ký hiệu tắt cho điều này không?

Câu trả lời:


137

Không có nhiều phím tắt, nhưng bạn có thể làm điều này:

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

1
Tôi đồng ý rằng nó trông mát mẻ hơn. Tôi đã hy vọng sẽ có một cách ngắn hơn để làm điều này nhưng tôi sẽ giải quyết một cách mát mẻ hơn!
Alex

@ A5C1D2H2I1M1N2O1R2T1 Tôi đánh giá cao sự sạch sẽ và ngắn gọn, nhưng bạn có thể giải thích "[[" không? Tôi không tìm thấy bất cứ điều gì trong hữu ích lapply?
Mehrad Mahmoudian

2
@MehradMahmoudian, một nơi tốt hơn để xem sẽ là "giải nén" ( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html ).
A5C1D2H2I1M1N2O1R2T1

43

Một khả năng khác sử dụng purrrthư viện đẹp :

library(purrr)
map(x, 1)

5
Đối với những người đang thắc mắc, điều này hoạt động vì mapgiải thích các giá trị số dưới dạng trích xuất, như[[
qwr 12/12/18

11

Đối với danh sách ví dụ của bạn, bạn chỉ có thể làm:

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

nhưng điều đó phụ thuộc vào mỗi danh sách con có chính xác 2 phần tử.

Nếu có số lượng phần tử khác nhau thì trước tiên bạn có thể thực hiện sapplyphép tính độ dài, sau đó tính vị trí phần tử thứ nhất tương ứng (xem cumsum), sau đó chọn các giá trị đó từ unlistdanh sách chỉnh sửa. Nhưng đến lúc đó câu trả lời được chấp nhận có lẽ đơn giản hơn nhiều.

Nếu tất cả các danh sách con có cùng độ dài (nhưng có thể khác 2) thì bạn có thể làm như sau:

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

hoặc một số đúc khác đến một đối tượng chung. Nhưng tôi nghi ngờ rằng điều này sẽ hiệu quả như lapplycách tiếp cận.


2

Chúng ta có thể sử dụng plucktừ rvestđó chọn phần tử đầu tiên từ mỗi danh sách lồng nhau

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

#[[2]]
#[1] 3

#[[3]]
#[1] 5

Lưu ý rằng điều này cho kết quả khác với plucktừ purrrđó chọn phần tử thứ nhất ( x[[1]])

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

0

Không chính xác là một ký hiệu ngắn, nhưng điều này cũng có thể được thực hiện với một nếp gấp:

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

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.