【问题标题】:how can I speed a function in tidyr up如何加快 tidyr 中的功能
【发布时间】:2016-12-11 11:56:39
【问题描述】:

我有这样的数据

    n <- 1e5
set.seed(24)
df1 <- data.frame(query_string = sample(sprintf("%06d", 100:1000), 
 n, replace=TRUE), id.x = sample(1:n), 
                  s_val = sample(paste0("F", 400:700), n, 
        replace=TRUE), id.y = sample(100:3000, n, replace=TRUE), 
            ID_col_n = sample(100:1e6, n, replace=TRUE), total_id = 1:n)

我使用扩展函数使用以下函数分配公共字符串

library(tidyr)

res <- spread(resNik,s_val,value=query_string,fill=NA)

这很有效,但是当数据很大时,它就像永远不会结束。我不知道我的电脑是挂了还是还在运行,因为两个小时后仍然没有任何反应

我想知道是否有人可以帮助我使用比spread 更快的其他功能或其他东西?

【问题讨论】:

  • 我认为library(data.table);dcast(setDT(resNik), id.x+id.y + ID_col_n +total_id~s_val, value.var = "query_string") 应该更快,并且根据here 它正在使用快速整形方法
  • @akrun res1
  • 应该是一些属性问题检查all.equal(res2, res3, check.attributes=FALSE)
  • 我检查了一个 1e5 数据集,dcast 更快。关于相等性,它是 1) 基于顺序 2) 必须转换为相同的类,即 data.frame 并检查。显示在下面我的解决方案中

标签: r tidyr


【解决方案1】:

基于对 1e5 行的基准测试,dcast 来自 data.tablefaster

library(data.table)
system.time({res1 <- spread(df1,s_val,value=query_string,fill=NA)})
# user  system elapsed 
#   1.50    0.25    1.75 


system.time({res2 <- dcast(setDT(df1), id.x+id.y + ID_col_n +total_id~s_val,
                                  value.var = "query_string")})
# user  system elapsed 
#   0.61    0.03    0.61 

res11 <- res1 %>%
           arrange(id.x)
res21 <- res2[order(id.x)]  

all.equal(as.data.frame(res11), as.data.frame(res21), check.attributes=FALSE)  
#[1] TRUE

差异随着行数的增加而增加,即从'n'变为1e6

system.time({res1 <- spread(df1,s_val,value=query_string,fill=NA)})
#   user  system elapsed 
# 28.64    3.17   31.91 
system.time({res2 <- dcast(setDT(df1), id.x+id.y + ID_col_n +total_id~s_val,
                                  value.var = "query_string")})
#   user  system elapsed 
#   5.22    1.08    6.21 

数据

n <- 1e5
set.seed(24)
df1 <- data.frame(query_string = sample(sprintf("%06d", 100:1000), 
 n, replace=TRUE), id.x = sample(1:n), 
                  s_val = sample(paste0("F", 400:700), n, 
        replace=TRUE), id.y = sample(100:3000, n, replace=TRUE), 
            ID_col_n = sample(100:1e6, n, replace=TRUE), total_id = 1:n)

【讨论】:

猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2016-04-13
  • 2011-10-12
  • 2016-12-20
  • 2017-10-04
  • 2014-08-03
相关资源
最近更新 更多