【发布时间】:2018-04-13 20:50:13
【问题描述】:
我有一个格式如下的数据框
df <- data.frame(name=LETTERS[1:5], location=c(2000,2021,4532,1931,3457),
value=c(1,0,1,1,0))
name location value
A 2000 1
B 2021 0
C 4532 1
D 1931 1
E 3457 0
数据框中大约有一百万行。如果位置之间的距离在 1000 以内,我将如何创建一个新的数据框,其中每个位置之间的距离还检查两个位置的值是否都是一个?
对于上述数据集,数据框将只有三行,其值为 21(绝对值 2000 - 2021)、69(绝对值 2000 - 1931)和 90(绝对值 2021-1931 ) 因为这些是唯一小于 1000 的差异。它还将有一列 0(因为 A 和 B 值不是 1 和 1)、1(因为 A 和 C 值是 1 和 1)和 0(因为 B 和 C 不是 1 和 1)。所以它看起来像:
21 0
69 1
90 0
我尝试过使用循环,但由于行数太多,效率低下。是否有一些内置功能可以让我更快地做到这一点? 提前致谢。
【问题讨论】:
-
令我惊讶的是,您似乎不想在输出中添加任何标签。您是否不想知道与输出中的行对应的名称?
-
首先,通过增加
location对数据帧进行排序(排序)似乎很明显。那么距离列就是diff(location)。然后,您可以使用location列上 +/- 1000 的滑动窗口来完成剩下的工作。 -
@smci 如果有很多 (>2) 个位置彼此靠近,则不会。这实际上发生在示例数据中。
-
@Renu:它确实使它更简单,因为我们可以使用简单的逻辑索引:在
location上创建一个 +/- 1000 的窗口,不包括给定的行。然后我们可以在该窗口上使用 sapply/dplyr/data.table 聚合。我从来没有说过窗口只会包含一个成员。 -
@smci 我怀疑您是否会得到标准的分组工具来正常工作。如果您有位置 2000、2050 和 2120,则您没有互斥的石斑鱼。也许
rollapply有这方面的东西?如果我要做一个 R 解决方案,我会在 data.table 中使用非 equi 连接来模仿 renu 的答案。
标签: r dataframe data-science