【发布时间】:2015-03-28 10:45:24
【问题描述】:
我有一个数据框列表。我需要根据数据框一列中的标准对该列表的数据框进行子集化。
(列表的所有数据框具有相同的列数和名称,以及相同的行数)
例如,我有:
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))
如何使用数据框列表执行此操作?
【问题讨论】:
-
l[[which.min(sapply(l, function(df) sum(abs(df$y - a))))]]怎么样 -
您也可以跳过循环,将它们全部绑定到一个数据集中(因为它们都具有相同的维度)并找到最小值,例如使用数据表包
rbindlist(l)[, .SD[abs(y - a) == which.min(abs(y - a))]]跨度> -
或使用
dplyrbind_rows(l) %>% filter(abs(y-a)==which.min(abs(y-a))) -
rbindlist(l)[abs(y - a) == which.min(abs(y - a))]会更简单。 -
@user3016709 David Arenburg 的方法应该更快,其次是
dplyr(虽然没有测试)
标签: r