我有一个数据帧列表,我想向其附加一个向量(将向量的一个值附加到列表中的每个数据帧)。
我想选择向量的最小值并将其附加到列表中具有最高值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)])
谢谢!