Берем последний элемент векторов из списка и создаем из него новый вектор

#r #list

#r #Список

Вопрос:

Я хочу создать фрейм данных из последних элементов списка. Я описал здесь два случая, один простой, а другой немного усложненный.

Простой пример

Давайте предположим, что список или два вектора, v

 v <- list("22" = c(2, 3, 5), "23" = c("aa", "bb")) 
> str(v)
List of 2
 $ 22: num [1:3] 2 3 5
 $ 23: chr [1:2] "aa" "bb"
  

Я хочу иметь фрейм данных, где в первом столбце у меня будут имена элементов (здесь 22 и 23), а во втором столбце у меня будет последний элемент этого вектора.

Я могу написать следующие коды, чтобы сгенерировать то, что я хочу,

 last_elems1 <- lapply(v, tail, n = 1L)
last_elems1 <- data.frame(last_elems1) 
tidyr::gather(last_elems1)

> tidyr::gather(last_elems1)
  key value
1 X22     5
2 X23    bb
  

У меня здесь следующие вопросы,

  1. Как я могу избежать «X» s в столбце «ключ», например, я хочу только номер 22, а не X22.
  2. Должен ли я беспокоиться о сообщении об ошибке?

    Предупреждающее сообщение: атрибуты не идентичны для переменных измерения; они будут удалены

Слегка дополненный пример

Здесь у меня есть список из двух (или более) фреймов данных с двумя векторами внутри. Список может быть сгенерирован следующим образом,

 w <- list("22" = data.frame(a = c(2, 3, 5), 
                            b = c(5, 6, 8)), 
          "23" = data.frame(a = c(9, 10), 
                            b = c(11, 12))
          )
> str(w)
List of 2
 $ 22:'data.frame': 3 obs. of  2 variables:
  ..$ a: num [1:3] 2 3 5
  ..$ b: num [1:3] 5 6 8
 $ 23:'data.frame': 2 obs. of  2 variables:
  ..$ a: num [1:2] 9 10
  ..$ b: num [1:2] 11 12
  

Я хочу иметь последний элемент переменной b из каждого фрейма данных внутри списка. Я использую те же коды, что описаны выше, и это дает мне следующее,

 last_elems2 <- lapply(w, tail, n = 1L)
last_elems2 <- data.frame(last_elems2)
tidyr::gather(last_elems2)

> tidyr::gather(last_elems2)
    key value
1 X22.a     5
2 X22.b     8
3 X23.a    10
4 X23.b    12
  

Вот мои вопросы,

  1. Как получить значение в столбце key like 22 вместо X22.b .
  2. Мне нужны только строка 2 и row 4 . Это означает, что результат должен быть,
 tidyr::gather(last_elems2)
   key value
1   22     8
2   23    12
  

Есть идеи, как точно настроить то, что я делаю?

Ответ №1:

Базовый вариант R

 stack(lapply(w, function(x) {
  x[dim(x)[1], "b"] # return last element of column "b"
}))
#  values ind
#1      8  22
#2     12  23
  

Когда мы используем dim , мы предполагаем, что w не содержит векторов — поскольку вектор не имеет атрибута dimensions. Вам нужно было бы изменить эту часть на x[length(x)] then.

данные

 w <- list("22" = data.frame(a = c(2, 3, 5), 
                            b = c(5, 6, 8)), 
          "23" = data.frame(a = c(9, 10), 
                            b = c(11, 12))
)