如何更有效地对多个data.frame列表进行分类?

时间:2016-12-17 17:51:59

标签: r dataframe dplyr

我正在尝试使用阈值对data.frame列表进行分类,打算将不同的data.frame集合作为输出。但是,尝试使用dplyr,tidyr包中的一些有用功能来实现我想要的输出,但是无法生成所需的data.frame列表。我有点使用dplyr,tidyr包,还在学习它的插图。因为我有两个以上的data.frame列表需要分类,所以将多个data.frame列表作为我的函数的输入,然后我打算按照pos.score列对每个data.frame进行分类,所以最终输出可以是data.frame列表。如何通过使用dplyr或tidyr包来实现这一点?有什么方法可以得到我预期的输出?任何人都可以让我有可能实现这一目标吗?非常感谢

可重复的data.frame:

Qualified <- list(
  hotan = data.frame( begin=seq(1, by=6, len=20), end=seq(4, by=6, len=20), pos.score=sample(30, 20)),
  aksu = data.frame( begin=seq(3, by=9, len=15), end=seq(6, by=9, len=15), pos.score=sample(28, 15)),
  korla = data.frame( begin=seq(6, by=8, len=18), end=seq(11, by=8, len=18), pos.score=sample(22, 18))
)

UnQualified <- list(
  hotan = data.frame( begin=seq(9, by=12, len=30), end=seq(14, by=12, len=30), pos.score=sample(35, 30)),
  aksu = data.frame( begin=seq(13, by=10, len=20), end=seq(19, by=10, len=20), pos.score=sample(34, 20)),
  korla = data.frame( begin=seq(23, by=11, len=24), end=seq(31, by=11, len=24), pos.score=sample(27, 24))
)

所以这是如何对一个data.frame列表进行分类的最简单的功能:

func <- function(dfList, threshold) {
  catg <- lapply(dfList, function(elm) {
    res <- split(elm, ifelse(elm$pos.score >=threshold, "valid", "invalid"))
  })
  return(catg)
}

但是对每个data.frame列表使用此函数是不可取的。我正在寻找更多的程序化,动态解决方案,将两个或多个data.frame合并为一个,然后将每个data.frame分类为给定的阈值。我怎样才能更有效地实现这一目标?好吗?

我想要的输出,是data.frame列表,如下所示:

$hotan.valid.Qualified
$hotan.invalid.Qualified
$hotan.valid.UnQualified
$hotan.invalid.UnQualified
$aksu.valid.Qualified
$aksu.invalid.Qualified
$aksu.valid.UnQualified
$aksu.invalid.UnQualified
$korla.valid.Qualified
$korla.invalid.Qualified
$korla.valid.UnQualified
$korla.invalid.UnQualified

如何获得预期的输出?有没有办法产生这个输出?

2 个答案:

答案 0 :(得分:2)

将OP中的@Franks注释与额外的tidyverse集成以进一步清理,在这里你可以:

ALLdata <- 
    bind_rows(c(Qualified = Qualified, Unqualified = UnQualified), .id = "id") %>% 
    separate(id, c("Catg", "Name")) %>%
    mutate(elm = ifelse(pos.score >= 18, "valid", "invalid")) %>% 
    arrange(Name, Catg, desc(elm))

它可以在一个快乐的数据框中一起获取数据。然后你就可以开始真正的魔法了:根据找到的法术的源书here

我想你下一步将是对所有结果做一个总结。将所有数据保存在一个数据框中将使下一步更容易。

答案 1 :(得分:1)

考虑浏览R基本函数:setNamesappendpastesapplyouterorder,{{1 }}:

c
相关问题