gpt4 book ai didi

r - 找到获得向量中相同元素之间所有间隔的最快方法

转载 作者:行者123 更新时间:2023-12-03 21:04:14 25 4
gpt4 key购买 nike

假设我有一个包含 8 个字母的字符向量,每个字母出现两次:

x <- rep(LETTERS[1:8],2)
set.seed(1)
y <- sample(x)
y

# [1] "E" "F" "A" "D" "C" "B" "C" "G" "F" "A" "B" "G" "E" "H" "D" "H"

我想找到每对字母之间的间隔。这里,间隔是指两个相同字母之间的字母数。我可以像这样手动执行此操作:
abs(diff(which(y=="A")))-1  #6
abs(diff(which(y=="D")))-1 #10
abs(diff(which(y=="H")))-1 #1

我写了一个 for循环来做到这一点......
res<-NULL
for(i in 1:8){ res[[i]] <- abs(diff(which(y==LETTERS[i])))-1 }

names(res)<-LETTERS[1:8]
res

# A B C D E F G H
# 6 4 1 10 11 6 3 1

但是,我想在具有很长向量的随机化过程中使用这种方法。速度对此至关重要 - 我想知道是否有人有好的想法来尽可能快速地解决这个问题。

最佳答案

您需要设置一个索引向量,然后执行 diff(index vector)-by-group 操作。

这是它在 data.table 中的样子包裹:

require(data.table)
yDT <- data.table(y)

yDT[,diff(.I)-1,keyby=y]
# y V1
# 1: A 6
# 2: B 4
# 3: C 1
# 4: D 10
# 5: E 11
# 6: F 6
# 7: G 3
# 8: H 1

这里的索引向量是特殊的(内置)变量 .I , 存储行号。
keyby=y通过 y 分组并按字母顺序对结果进行排序;与 by=y 交替,我们将看到按组的首次出现排序的结果。 (感谢@Arun 指出这一点。)

基本 R 中的类似解决方案看起来像
tapply(1:length(y),y,diff)-1
# A B C D E F G H
# 6 4 1 10 11 6 3 1

关于r - 找到获得向量中相同元素之间所有间隔的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29882727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com