【问题标题】:faster/better way to split data frame更快/更好的分割数据框的方法
【发布时间】:2020-05-03 22:12:12
【问题描述】:

您好,我想知道是否有更好的方法来做到这一点:

# any test and or data frame those ones are just for the exemple
test <- sample(rep(c(TRUE,FALSE),times = 100000),10000)
dat <- data.frame(A = numeric(10000),B=character(10000),C=factor('expl'))

datYes <- dat[test,]
datNo <- dat[!test]

这个想法是,如果条件为真,则将数据帧分割成一个条件,如果条件为真,则数据进入数据帧 1,如果它在一秒钟内为假

我的意思是更好的方式是一种恶化的方式,我目前正在使用 data.frame 但我将更改为 data.table 并且我的主要想法是使用最快的方式进行 data.table 即使它目前较慢我很快就换了

【问题讨论】:

  • 如果当前实现很慢,您将如何使用此代码(在生产中)?您认为什么是可接受的更快解决方案?
  • 它不是拆分而是子集 2x,data.table 应该可以更好地扩展。您使用的方式应该是快速的,尝试详细的参数。仅当您多次循环此子集时,才有意义。见github.com/Rdatatable/data.table/issues/3736

标签: r


【解决方案1】:

data.table 绝对比标准的data.frame 类更快、更高效。您可以使用二进制搜索来实现您的想法。

下面我使用iris 数据集向您展示它是如何工作的。

library(data.table)

data("iris")
setDT(iris)

set.seed(1970)
iris[ , test := sample(rep( c(TRUE, FALSE), times = nrow(iris)), nrow(iris)) ]

setkey(iris, test)
iris_true = iris[ .(TRUE) ]
iris_false = iris[ .(FALSE) ]

reprex package (v0.3.0) 于 2020 年 5 月 3 日创建

您可以通过以下方式实现相同的目标:

iris_true = iris[ test == TRUE ]
iris_false = iris[ test == FALSE ]

请记住,第一种方法效率更高,速度更快。

如果可以的话,我建议您投资学习 data.table,这是一个语法非常清晰的优秀软件包。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我不确定这是不是你想要的

    list2env(setNames(split(dat,test),c("datNo","datYes")),envir = .GlobalEnv)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2022-01-16
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 2017-05-11
      相关资源
      最近更新 更多