【发布时间】:2014-09-16 07:41:43
【问题描述】:
假设我有一个 500 万行的数据框,有两列,因此(为简单起见,此数据框只有十行):
df <- data.frame(start=c(11,21,31,41,42,54,61,63), end=c(20,30,40,50,51,63,70,72))
我希望能够在数字向量中生成以下数字:
11 to 20, 21 to 30, 31 to 40, 41 to 50, 51, 54-63, 64-70, 71-72
然后取新向量的长度(本例为10+10+10+10+1+10+7+2)=60
*注意,我不需要向量本身,只要它的长度就足够了。因此,如果有人有更智能的逻辑方法来获取长度,那是受欢迎的。
本质上,所做的是对数据帧中的每一行,采用从头到尾的序列,然后将所有这些序列组合起来,然后过滤 UNIQUE 值。
所以我使用了这样的方法:
length(unique(c(apply(df, 1, function(x) {
return(as.numeric(x[1]):as.numeric(x[2]))
}))))
在我的 500 万行数据帧上,这证明非常慢。
有更快更有效的解决方案吗?奖金,请尝试添加系统时间。
用户系统已过 19.946 0.620 20.477
【问题讨论】:
-
如果您有 500 万行数字数据,您应该使用
matrix,而不是data.frame -
新向量的长度不只是差值的总和(加1)吗?
sum(df$end - df$start + 1)? -
@konvas;不像有些开始是在前一个结束之前
-
不,因为有重叠。在df数据帧中,第四行是41-50,第五行是42-51。根据您的方法,唯一数字的总数将是 (50-41+1)+(51-42+1) = 20,而应该是 41-51,或 (51-41+1) = 11。跨度>
-
@Richard Scriven 好的,即使转换为矩阵,也应该有更快的方法。顺便说一句,我正在编写的脚本的另一部分已经生成了一个数据框。
标签: r