#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
У меня здесь следующие вопросы,
- Как я могу избежать «X» s в столбце «ключ», например, я хочу только номер 22, а не X22.
-
Должен ли я беспокоиться о сообщении об ошибке?
Предупреждающее сообщение: атрибуты не идентичны для переменных измерения; они будут удалены
Слегка дополненный пример
Здесь у меня есть список из двух (или более) фреймов данных с двумя векторами внутри. Список может быть сгенерирован следующим образом,
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
like22
вместоX22.b
. - Мне нужны только строка
2
и row4
. Это означает, что результат должен быть,
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))
)