gpt4 book ai didi

r - 编写一个将向量作为输入、丢弃不需要的值、删除重复项并返回原始向量的相应索引的函数

转载 作者:行者123 更新时间:2023-12-02 16:02:27 24 4
gpt4 key购买 nike

我正在尝试编写一个函数,它接受一个向量并根据几个步骤对其进行子集化:

  1. 丢弃任何不需要的值
  2. 删除重复项。
  3. 在考虑步骤 (1) 和 (2) 后返回原始向量的索引

例如,提供以下输入向量:

vec_animals <- c("dog", "dog", "dog", "dog", "cat", "dolphin", "dolphin")

throw_away_val <- "cat"

我希望我的函数 get_indexes(x = vec_animals, y = throw_away_val) 返回:

# [1] 1 6   # `1` is the index of the 1st unique ("dog") in `vec_animals`, `6` is the index of the 2nd unique ("dolphin")

另一个例子

vec_years <- c(2003, 2003, 2003, 2007, 2007, 2011, 2011, 2011)
throw_away_val <- 2003

返回:

# [1] 4 6 # `4` is the position of 1st unique (`2007`) after throwing away unwanted val; `6` is the position of 2nd unique (`2011`).

我的初步尝试

以下函数返回索引但不考虑重复项

get_index <- function(x, throw_away) {
which(x != throw_away)
}

然后返回原始 vec_animals 的索引,例如:

get_index(vec_animals, "cat")
#> [1] 1 2 3 4 6 7

如果我们使用此输出对 vec_animal 进行子集化,我们将得到:

vec_animals[get_index(vec_animals, "cat")]
#> [1] "dog" "dog" "dog" "dog" "dolphin" "dolphin"

您可能建议对此输出进行操作,例如:

vec_animals[get_index(vec_animals, "cat")] |> unique()
#> [1] "dog" "dolphin"

但不,我需要 get_index() 立即返回正确的索引(在本例中为 16)。


编辑


提供了获取第一次出现重复项索引的相关程序

library(bit64)

vec_num <- as.integer64(c(4, 2, 2, 3, 3, 3, 3, 100, 100))
unipos(vec_num)
#> [1] 1 2 4 8

或者更一般地

which(!duplicated(vec_num))
#> [1] 1 2 4 8

如果不需要丢弃不需要的值,这样的解决方案会很棒。

最佳答案

尝试:

get_index <- function(x, throw_away) {
which(!duplicated(x) & x!=throw_away)
}

> get_index(vec_animals, "cat")
[1] 1 6

关于r - 编写一个将向量作为输入、丢弃不需要的值、删除重复项并返回原始向量的相应索引的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70273073/

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