【问题标题】:Subset dataframe in a list by a dataframe column criteria按数据框列标准在列表中子集数据框
【发布时间】: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))]]跨度>
  • 或使用dplyr bind_rows(l) %&gt;% filter(abs(y-a)==which.min(abs(y-a)))
  • rbindlist(l)[abs(y - a) == which.min(abs(y - a))] 会更简单。
  • @user3016709 David Arenburg 的方法应该更快,其次是dplyr(虽然没有测试)

标签: r


【解决方案1】:

根据@David Arenburg、@akrun 和@shadow 的答案和cmets,这里有我发布的问题的三种可能解决方案:

选项 1)

library(data.table)
rbindlist(l)[abs(y - a) == min(abs(y - a))]

选项 2)(需要 R 版本 > 3.1.2)

library(dplyr)
bind_rows(l) %>% filter(abs(y-a)==which.min(abs(y-a)))

选项 3)(也可以完美运行,但如果在大循环或迭代过程中使用,则计算速度比前 2 个选项要慢)

l[[which.min(sapply(l, function(df) sum(abs(df$y - a))))]]

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2016-11-04
    • 2014-12-26
    • 1970-01-01
    • 2012-03-29
    • 2021-12-16
    • 2019-11-12
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多