避免在 R 中使用嵌套 for 循环:如何在不使用嵌套 for 循环函数的情况下基于两个字符变量的比较来创建新变量?
例如,我有两个字符变量A和B:
A=c("yellow","orange","dog","dog","green","heaven","tree") #searchspace
B=c("dog","house","tree","yellow","dog","road","hell","rain","dog","tree") # target labels
对于搜索空间 (A) 中的每个元素,我想要:
- 计算该元素在列表 (B) 中出现的次数,
- 如果存在,它首先在列表 B 中的哪个位置找到,
- 如果存在于 B 中的多个位置,则最后在列表 B 中找到的位置是哪个位置。
- 将输出 (1)、(2) 和 (3) 保存在包含列表 A 的 data.table 中。
输出看起来像这样:
A totcount firstindex lastindex
1: yellow 1 4 0
2: orange 0 0 0
3: dog 3 1 9
4: dog 3 1 9
5: green 0 0 0
6: heaven 0 0 0
7: tree 2 3 10
我已经编写了一个嵌套的 for 循环函数来运行它,但是这真的很慢,因为列表 A 和 B 分别拥有超过 16k 和 2K 的元素。 我一直在努力使用应用函数来解决这个问题。
如有任何建议,我们将不胜感激。 谢谢
最佳答案
您可以将 A
放入数据框中并使用 dplyr
进行计算,而无需使用 apply
。
library(dplyr)
df <- as.data.frame(A)
df %>%
group_by(A) %>%
mutate(totcount = sum(B %in% A),
firstindex = ifelse(totcount > 0, min(which(B %in% A)), 0),
lastindex = ifelse(totcount > 1, max(which(B %in% A)), 0))
#> # A tibble: 7 x 4
#> # Groups: A [6]
#> A totcount firstindex lastindex
#> <fct> <int> <dbl> <dbl>
#> 1 yellow 1 4 0
#> 2 orange 0 0 0
#> 3 dog 3 1 9
#> 4 dog 3 1 9
#> 5 green 0 0 0
#> 6 heaven 0 0 0
#> 7 tree 2 3 10
关于r - 如何在不使用嵌套 for 循环函数的情况下根据两个字符变量的比较创建新变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58434619/