【发布时间】:2023-03-14 19:21:01
【问题描述】:
我有一个 data.frame,其中 2 列代表 2 个基因之间的相互作用。 data.frame 的外观示例:
head(df)
V1 V2
A1BG A1BG
A1BG CRISP3
A1CF A1CF
A1CF APOBEC1
A1CF CUGBP2
A1CF KHSRP
我想根据第一列的值拆分 data.frame,我使用了以下命令:
out <- split(df, df$V1)
期望的输出应该是:
out
$A1BG
[1] A1BG CRISP3
$A1CF
[2] A1CF APOBEC1 CUGBP2 KHSRP
但是,使用拆分的过程需要很长时间,因为我的文件太大(大约 200,000 行)
非常感谢
【问题讨论】:
-
确保您的列不是因素。加载您的文件或使用参数
stringsAsFactors=FALSE创建您的data.frame。然后执行:split(df$V2, df$V1)。它应该很快。我尝试了 1e5 data.frame,它在 0.07 秒内完成。 -
@Arun 不同之处在于您使用的是
split.default,而split.data.frame是针对OP 的数据调用的。在内部,split.default必须创建一个因子,如果f不是一个因子,所以我看不出在提供非因子f时它如何更快。 -
当我尝试这个字符时,这两种情况下的时间都比因素长:
char <- rep(c("a", "b"), each = 10000); fac <- factor(char); library(rbenchmark); benchmark(split(char, char), split(fac, fac)); DF.char <- data.frame(char, stringsAsFactors = FALSE); DF.fac <- data.frame(fac); benchmark(split(DF.char, char), split(DF.fac, fac)) -
@JoshO'Brien 不,我认为这与 Arun 所建议的因素
f无关。 -
@Arun 我明白你现在的意思了——完全不清楚你在原始评论中指的是要拆分的变量。您的后续评论使用了带有
x和y的数据,但显示了带有df$V1和df$V2的使用代码,而没有说明x和y是哪个。我想我必须测试与你所做的相反的事情。因此,我完全同意论点x,如果是一个因素,不如非因素x快。我以为我们在讨论争论f。
标签: r