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

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

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

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

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

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



답변

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

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


답변

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

library(purrr)
map(x, 1)


답변

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

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

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

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

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

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

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


답변

우리는 사용할 수 있습니다 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


답변

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

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

# [[1]]
# [1] 1
# 
# [[2]]
# [1] 3
# 
# [[3]]
# [1] 5


답변