Si j'ai une liste comme celle-ci:

 list_data <- list(c("Red", "Green","red"), 
                   c(21,32,11,2,3,6,5,4), 
                   c(1,2,5,4,TRUE, 51.23, 119.1))

Je souhaite conserver les 2 derniers éléments avant le dernier de la liste: sortie souhaitée:

  > list_data
  [[1]]
  [1] "Red"   "Green" 

  [[2]]
   [1]  6  5  

  [[3]]
  [1]   1.00  51.23 

Une idée à ce sujet?

r
1
bic ton 20 nov. 2018 à 13:24

3 réponses

Meilleure réponse

Une autre option utilisant tail, i.e.

lapply(list_data, function(i)tail(i, 3)[-3])
#[[1]]
#[1] "Red"   "Green"

#[[2]]
#[1] 6 5

#[[3]]
#[1]  1.00 51.23
2
Sotos 20 nov. 2018 à 10:34

Solution avec Map (merci à @Sotos pour tail):

Map(function(x)tail(x, 3)[-3],list_data) 
# [[1]]
# [1] "Red"   "Green"
# 
# [[2]]
# [1] 6 5
# 
# [[3]]
# [1]  1.00 51.23

Si vous nommez chaque élément, vous pouvez obtenir un data.frame en utilisant purrr:

names(list_data) <- letters[1:3]
purrr::map_df(list_data, function(x) x[length(x)-2:1]) # ~ .x[length(.x)-(2:1)]

# # A tibble: 2 x 3
# a         b     c
# <chr> <dbl> <dbl>
# 1 Red       6   1  
# 2 Green     5  51.2
1
RLave 20 nov. 2018 à 10:37

Vous pourriez faire

lapply(list_data, function(x) x[(length(x) - 2:1)])
#[[1]]
#[1] "Red"   "Green"

#[[2]]
#[1] 6 5

#[[3]]
#[1]  1.00 51.23
2
markus 20 nov. 2018 à 10:29