Взятие последнего элемента векторов из списка и создание из него нового вектора - PullRequest
0 голосов
/ 08 марта 2019

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

Простой случай

Предположим, список или два вектора 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" в столбце "ключ", например, я хочу только номер 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

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

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

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

1 Ответ

1 голос
/ 08 марта 2019

Базовая опция 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 не содержит векторов - поскольку у вектора нет атрибута измерений.Затем вам нужно изменить эту часть на x[length(x)].

data

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))
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...