我有这样的数据

    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更快的其他功能?

最佳答案

根据1e5行上的基准,来自dcastdata.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)

08-20 00:58
查看更多