我正在嘗試撰寫一個函式,該函式將數字向量作為輸入,并根據一些規則回傳輸入向量的較短版本的索引:
(a) 如果所有元素都相同,則只回傳第一個元素的索引;即,回傳
1;別的:如果不是所有元素都相同,則測驗是否
special_treatment_value在其中:- (b) 如果
special_treatment_value存在,則回傳輸入向量的索引, 除了special_treatment_value出現的元素的索引;別的: - (c) 如果
special_treatment_value不存在,則按原樣回傳輸入向量的索引,即1:length(x)。
- (b) 如果
問題:如果我們在路徑 (b) 中結束,我們可能會遇到所有向量元素現在都相同的情況。在這種情況下,我們想再次遍歷 (a) 以最小化到第一個元素。
例子
假設我想通過我的函式傳遞以下向量:
my_vec_1 <- c(1, 2, 1, 2, 3)
my_vec_2 <- c(4, 4, 4)
my_vec_3 <- c(1, 2, 1, 4, 1)
my_vec_4 <- c(3, 3, 3, 4)
然后:
special_treatment_value <- 4
根據我的規則,該函式應該回傳輸出:
- for
my_vec_1:它適合路線(c),因此輸出應該是1:5(所有索引) - for
my_vec_2:它適合路線(a),因此輸出應該是1(第一個索引) - 對于
my_vec_3:它適合路線(b)。輸出應該是1 2 3 5(除特殊值之外的所有索引) my_vec_4說明問題。我想要的輸出是1因為首先我們通過路線 (b) 然后我想通過 (a)。但現在它沒有發生,我的函式(見下文)回傳1 2 3(除特殊值外的所有索引)。
我目前的嘗試
get_indexes <- function(x, special_val) {
if (var(x) == 0) { # route (a)
output_idx <- 1
return(output_idx)
}
idx_entire_length <- 1:length(x)
if (any(x == special_val)) { # route (b)
idx_to_remove <- which(x == special_val)
output_idx <- idx_entire_length[-idx_to_remove]
return(output_idx)
}
# else
output_idx <- idx_entire_length # route (c)
return(output_idx)
}
get_indexes(my_vec_1, 4)
#> [1] 1 2 3 4 5
get_indexes(my_vec_2, 4)
#> [1] 1
get_indexes(my_vec_3, 4)
#> [1] 1 2 3 5
get_indexes(my_vec_4, 4)
#> [1] 1 2 3
我想應該有一些repeat塊或while回圈,但我無法弄清楚如何正確(和有效地)實作它。
uj5u.com熱心網友回復:
你可以試試
foo <- function(x, y){
tmp <- which(x != y)
if(dplyr::n_distinct(x[x!=y])<=1){
tmp <- 1
}
return(tmp)
}
相反,n_distinct()您可以使用length(unique())
結果:
lapply(list(my_vec_1, my_vec_2, my_vec_3, my_vec_4), foo, 4)
[[1]]
[1] 1 2 3 4 5
[[2]]
[1] 1
[[3]]
[1] 1 2 3 5
[[4]]
[1] 1
uj5u.com熱心網友回復:
您可以重復通過(a)內部條件(b) 的條件,例如:
f <- function(x, treatment){
if(var(x) == 0) 1 else {
if(treatment %in% x) {
x[-which(x == treatment)] |>
(\(.) if(var(.) == 0) 1 else (1:length(x))[-which(x == treatment)])()
} else {
1:length(x)
}
}
}
lapply(list(v1, v2, v3, v4), f, 4)
[[1]]
[1] 1 2 3 4 5
[[2]]
[1] 1
[[3]]
[1] 1 2 3 5
[[4]]
[1] 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376159.html
上一篇:將“呼叫”物件轉換為R中的函式
下一篇:我該怎么做才能使函式不堆疊?
