我有一个data.frame,其中2列代表2个基因之间的相互作用.如何查看data.frame的示例:
head(df)
V1 V2
A1BG A1BG
A1BG CRISP3
A1CF A1CF
A1CF APOBEC1
A1CF CUGBP2
A1CF KHSRP
Run Code Online (Sandbox Code Playgroud)
我想根据第一列的值拆分data.frame,我使用了以下命令:
out <- split(df, df$V1)
Run Code Online (Sandbox Code Playgroud)
期望的输出应该是:
out
$A1BG
[1] A1BG CRISP3
$A1CF
[2] A1CF APOBEC1 CUGBP2 KHSRP
Run Code Online (Sandbox Code Playgroud)
但是,使用split的过程需要很长时间,因为我的文件太大(大约200,000行)
非常感谢
为了加快速度,特别是如果你只需要df$V2拆分df$V1,在调用中只使用那个向量而split不是整个数据帧df.例如:
## Dummy data
df <- read.table(text = "V1 V2
A1BG A1BG
A1BG CRISP3
A1CF A1CF
A1CF APOBEC1
A1CF CUGBP2
A1CF KHSRP", header = TRUE)
## make it big!
df <- with(df, cbind.data.frame(V1 = rep(V1, length.out = 1e5),
V2 = rep(V2, length.out = 1e5)))
# time it
system.time(sp1 <- split(df, df$V1))
system.time(sp2 <- split(df$V2, df$V1))
> system.time(sp1 <- split(df, df$V1))
user system elapsed
0.024 0.000 0.016
> system.time(sp2 <- split(df$V2, df$V1))
user system elapsed
0.008 0.000 0.005
Run Code Online (Sandbox Code Playgroud)
这是一个很少级别的例子.在很多级别上,分割整个数据帧的低效率开始严重影响计算时间,例如对于具有大约10000级别的因素:
df2 <- data.frame(V1 = factor(sample(10000, 1e5, replace = TRUE)),
V2 = rnorm(1e5))
system.time(sp3 <- split(df2, df2$V1))
system.time(sp4 <- split(df2$V2, df2$V1))
> system.time(sp3 <- split(df2, df2$V1))
user system elapsed
5.332 0.000 4.216
>
> system.time(sp4 <- split(df2$V2, df2$V1))
user system elapsed
0.008 0.000 0.005
Run Code Online (Sandbox Code Playgroud)
这样做的原因是,在这种split(df, df$V1)情况下,split.data.frame调用该方法,该方法lapply()对矢量1:nrow(df)本身进行分组f(df$V2),并将函数(function(ind) x[ind, , drop = FALSE]))应用于每个组件.因此,随着级别数量的增加,对该匿名函数的函数调用次数也会增加并使计算时间膨胀.
在使用split(df$V2, df$v1)该split.default方法的情况下,如果使用因子调用,则f基本上只需要调用快速C实现split.因此,它不会产生任何调用匿名函数或重复调用的开销[.
| 归档时间: |
|
| 查看次数: |
471 次 |
| 最近记录: |