用 NA 替换重复项的自定义函数不起作用
Custom function to replace duplicates with NA does not work
这是我的函数:
my_func <- function(x){
ifelse(duplicated(x), NA_real_, first(x))
}
我想将它应用到这个向量:
vector <- c(1,1,1,3,3,3)
[1] 1 1 1 3 3 3
我的预期输出:
[1] 1 NA NA 3 NA NA
我试过 sapply
:
sapply(vector, my_func)
gives:
[1] 1 1 1 3 3 3
or changed the function to
my_func <- function(x){
ifelse(duplicated(x), NA_real_, x)
}
replace_dup = function(x, val = NA_real_) {
x[duplicated(x)] = val
x
}
replace_dup(vector)
[1] 1 NA NA 3 NA NA
对于要替换的索引,duplicated(x)
将是 TRUE
,因此您可以通过这些索引对向量进行子集化并替换它们。
我不知道为什么 ifelse(duplicated(x), NA_real_, x)
对您不起作用,因为这也是一个有效的解决方案(尽管稍微复杂一些)。当我 运行 它并产生正确的结果时它工作正常。
至于 sapply()
- 如果您有一个要应用此功能的列表,那将有效:
vectors = list(c(1, 1, 2, 1, 3), c(5, 5, 5))
sapply(vectors, replace_dup)
[[1]]
[1] 1 NA 2 NA 3
[[2]]
[1] 5 NA NA
Edit:如评论中所述 - 这里 sapply()
的问题是该函数已经设计用于处理整个向量。 sapply(vector, replace_dup)
会将 replace_dup()
应用于 vector
的每个单独元素,从而不会识别出重复项:
sapply(vector, replace_dup)
[1] 1 1 1 3 3 3
这是我的函数:
my_func <- function(x){
ifelse(duplicated(x), NA_real_, first(x))
}
我想将它应用到这个向量:
vector <- c(1,1,1,3,3,3)
[1] 1 1 1 3 3 3
我的预期输出:
[1] 1 NA NA 3 NA NA
我试过 sapply
:
sapply(vector, my_func)
gives:
[1] 1 1 1 3 3 3
or changed the function to
my_func <- function(x){
ifelse(duplicated(x), NA_real_, x)
}
replace_dup = function(x, val = NA_real_) {
x[duplicated(x)] = val
x
}
replace_dup(vector)
[1] 1 NA NA 3 NA NA
对于要替换的索引,duplicated(x)
将是 TRUE
,因此您可以通过这些索引对向量进行子集化并替换它们。
我不知道为什么 ifelse(duplicated(x), NA_real_, x)
对您不起作用,因为这也是一个有效的解决方案(尽管稍微复杂一些)。当我 运行 它并产生正确的结果时它工作正常。
至于 sapply()
- 如果您有一个要应用此功能的列表,那将有效:
vectors = list(c(1, 1, 2, 1, 3), c(5, 5, 5))
sapply(vectors, replace_dup)
[[1]]
[1] 1 NA 2 NA 3
[[2]]
[1] 5 NA NA
Edit:如评论中所述 - 这里 sapply()
的问题是该函数已经设计用于处理整个向量。 sapply(vector, replace_dup)
会将 replace_dup()
应用于 vector
的每个单独元素,从而不会识别出重复项:
sapply(vector, replace_dup)
[1] 1 1 1 3 3 3