중첩 된 목록의 첫 번째 요소 선택


88

다음과 같은 목록이 있다고 가정 해 보겠습니다.

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

중첩 된 목록의 첫 번째 요소 만 포함 된 목록을 원합니다. 이렇게 다른 목록을 반환하여이를 수행 할 수 있습니다.

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

이것에 대한 단축키 표기법이 있습니까?

답변:


144

단축키는 많지 않지만 다음과 같이 할 수 있습니다.

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

1
나는 그것이 더 멋져 보인다는 것에 동의한다. 이 작업을 수행하는 더 짧은 방법이 있기를 바랐지만 더 멋진 방법으로 만족할 것입니다!
Alex

@ A5C1D2H2I1M1N2O1R2T1 깨끗함과 짧음에 감사하지만 "[["에 대해 설명해 주시겠습니까? 난 아무것도 유용한에서 찾지 못했습니다 lapply?
Mehrad Mahmoudian에게

2
@MehradMahmoudian,보기에 더 좋은 곳은 "추출"( stat.ethz.ch/R-manual/R-devel/library/base/html/Extract.html )입니다.
A5C1D2H2I1M1N2O1R2T1

44

또 다른 가능성은 nice purrr라이브러리를 사용합니다 .

library(purrr)
map(x, 1)

5
궁금한 사람들을 위해 이것은 map숫자 값을 추출로 해석하기 때문에 작동합니다.[[
qwr

12

예제 목록의 경우 다음을 수행 할 수 있습니다.

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

하지만 정확히 2 개의 요소를 갖는 각 하위 목록에 따라 다릅니다.

요소 수가 다른 경우 먼저을 수행 sapply하여 길이를 계산 한 다음 해당하는 첫 번째 요소 위치를 계산 한 다음 (참조 cumsum) unlisted 목록 에서 해당 값을 선택할 수 있습니다. 그러나 그때까지 받아 들여진 대답은 아마도 훨씬 더 간단 할 것입니다.

모든 하위 목록의 길이가 같으면 (2와 다를 수 있음) 다음과 같이 할 수 있습니다.

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

또는 일반적인 개체에 대한 다른 캐스팅. 그러나 이것이 lapply접근 방식 만큼 효율적일 것 같지 않습니다.


3

우리는 사용할 수 있습니다 pluck에서 rvest하는 각 중첩 된 목록에서 첫 번째 요소를 선택

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

#[[2]]
#[1] 3

#[[3]]
#[1] 5

이것은 서로 다른 결과를 제공합니다 pluck에서 purrr첫번째 요소를 선택하는 ( x[[1]])

purrr::pluck(x, 1)

#[[1]]
#[1] 1

#[[2]]
#[1] 2

0

짧은 표기법은 아니지만 폴드를 사용하여 수행 할 수도 있습니다.

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

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.