我有一个数据框列表。我需要根据数据帧的一列中的条件对此列表的数据帧进行子集化。
(列表的所有数据帧都有相同的数字和列名,行数相同)
例如,我有:
l <- list(data.frame(x=c(2,3,4,5), y = c(4,4,4,4), z=c(2,3,4,5)),
data.frame(x=c(1,4,7,3), y = c(7,7,7,7), z=c(2,5,7,8)),
data.frame(x=c(2,3,1,8), y = c(1,1,1,1), z=c(6,4,1,3)))
names(l) <- c("MH1", "MH2","MH3")
输出
$MH1
x y z
1 2 4 2
2 3 4 3
3 4 4 4
4 5 4 5
$MH2
x y z
1 1 7 2
2 4 7 5
3 7 7 7
4 3 7 8
$MH3
x y z
1 2 1 6
2 3 1 4
3 1 1 1
4 8 1 3
所以我想要将“y”列与给定数字最接近的数据帧进行子集化。例如,如果我说a = 3,则所选数据帧应为“MH1”(其中列y = 4)
如果“l”是数据帧,我将执行以下操作:
closestDF <- subset(l, abs(l$y - a) == min(abs(l$y - a))
如何使用数据框列表执行此操作?
答案 0 :(得分:2)
根据@ David Arenburg,@ akrun和@shadow的回答和评论,这里有三种可能的解决方案来解决我发布的问题:
选项1)
library(data.table)
rbindlist(l)[abs(y - a) == min(abs(y - a))]
选项2)(需要R版本&gt; 3.1.2)
library(dplyr)
bind_rows(l) %>% filter(abs(y-a)==which.min(abs(y-a)))
选项3)(也可以很好地工作,但如果在大循环或迭代过程中使用,则计算速度比前两个选项快)
l[[which.min(sapply(l, function(df) sum(abs(df$y - a))))]]