r - 如何在不使用嵌套 for 循环函数的情况下根据两个字符变量的比较创建新变量?

标签 r for-loop apply

避免在 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) 中的每个元素,我想要:

  1. 计算该元素在列表 (B) 中出现的次数,
  2. 如果存在,它首先在列表 B 中的哪个位置找到,
  3. 如果存在于 B 中的多个位置,则最后在列表 B 中找到的位置是哪个位置。
  4. 将输出 (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/

相关文章:

r - R 中带有堆叠玫瑰的圆形时间图

r - For() 循环查找其他日期之间的 ID 日期并计算平均值

Python - OrderedDict 中的字典理解不起作用

R:使用特定于行的中断应用剪切

r - R 中的嵌套匹配函数

r - R 是否有类似 requirements.txt 的内容?

将 HRS 数据从宽格式 reshape 为长格式并创建时间变量

Java "break"似乎打破了两个嵌套的 for 循环

r - 获取 k 的任何元素与 R 中 x[i] 中的模式匹配的索引

python - 如何访问数据框滚动窗口中的单个元素