У меня есть список фреймов данных, к которым я хотел бы добавить вектор (добавляя одно значение вектора к каждому фрейму данных в списке).
Я хотел бы выбрать самое низкое значение вектора идобавьте его к кадру данных в списке с наибольшим значением stdev
(при сохранении порядка списка). Ниже приведен пример решения для уточнения!
ОБНОВЛЕНИЕ: список фреймов данных теперь имеет несколько столбцов.
#Data
#list of dataframes
lst <- list(A = data.frame(stdev = 2,
V1 = 2),
B = data.frame(stdev = 6,
V1 = 1),
C = data.frame(stdev = 4,
V1 = 4))
lst
#Vetor
vec <- c(10,5,11)
vec
Я могу подумать о длинном и не элегантном решении преобразования списка в фрейм данных иупорядочение, связывание, переупорядочение, переименование ..... слишком сложно:
library(data.table)
library(tidyverse)
df <- rbindlist(lst, idcol = "df_name") %>%
mutate(original_order = 1:n()) %>%
arrange(desc(stdev)) %>%
mutate(vec = vec[order(vec)]) %>%
arrange(original_order)
df
names <- df$df_name
names
lst1 <- split(df, seq(nrow(df)))
names(lst1) <- names
lst1
lst2 <- lapply(lst1, select, -c(df_name, original_order))
lst2
$A
stdev V1 vec
1 2 2 11
$B
stdev V1 vec
2 6 1 5
$C
stdev V1 vec
3 4 4 10
Это в конечном итоге дает мне правильный результат с наибольшим значением вектора, добавленным к наименьшему значению списка (вв оригинальном порядке), но есть ли более элегантное решение?
ОБНОВЛЕНИЕ: Благодарим @akrun и @RonakShah за это решение (объединение двух ответов):
vec <- sort(vec, decreasing = TRUE)
inds <- order(sapply(lst, "[[", "stdev"))
Map(cbind, lst, vec = vec[order(inds)])
Спасибо!