Привязать вектор к списку данных по значению - PullRequest
1 голос
/ 07 ноября 2019

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

Я хотел бы выбрать самое низкое значение вектора идобавьте его к кадру данных в списке с наибольшим значением 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)])

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Мы можем извлечь столбец stdev из lst, order их, использовать его для перестановки vec и cbind в исходное lst, используя Map

inds <- order(sapply(lst, "[[", "stdev"))
Map(cbind, lst, vec = sort(vec, decreasing = TRUE)[inds])

#$A
#  stdev V1 vec
#1     2  2  11

#$B
#  stdev V1 vec
#1     6  1   5

#$C
#  stdev V1 vec
#1     4  4  10
1 голос
/ 07 ноября 2019

Мы можем использовать Map

Map(cbind, lst[order(unlist(lst))], vec = vec[order(-vec)])[names(lst)]
#$A
#  stdev vec
#1     2  11

#$B
#  stdev vec
#1     6   5

#$C
#  stdev vec
#1     4  10

Или обновление, основанное на обновлении данных

Map(cbind, lst[order(unlist(lapply(lst, `[[`, "stdev")))],
       vec = vec[order(-vec)])[names(lst)]
#$A
#  stdev V1 vec
#1     2  2  11

#$B
#  stdev V1 vec
#1     6  1   5

#$C
#  stdev V1 vec
#1     4  4  10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...