Мне было интересно узнать о методах возврата повторяющихся значений в векторе, списке или массиве в R. Сосредоточившись на векторе, я определил следующее:
myvec <- c('a', letters)
который дублирует букву «а» в позиции 1 или 2, в зависимости от того, как вы ее определяете (позиция 2 в R). Если я войду duplicated(myvec). Я получаю логический вектор F, T, F, F, ..., как и ожидалось. Однако когда я вхожу:
Filter(duplicated, myvec)
Результат:
character(0)
Но я ожидаю a. Почему Filter не возвращает это значение?





Filter вызывает функцию duplicated для каждого элемента vec. Итак, он вызывает duplicated(a), снова duplicated(a), затем duplicated(b) и т. д.
Поскольку duplicated вызывается для каждого элемента отдельно, он никогда не видит оба "a".
Когда вы наберете Filter в консоли, вы увидите исходный код Filter.
> Filter
function (f, x)
{
f <- match.fun(f)
ind <- as.logical(unlist(lapply(x, f)))
x[which(ind)]
}
где выполняется поэлементная фильтрация. В этом смысле вы выполняете duplicated над каждым элементом myvec и проверяете их один за другим.
Поскольку одно значение никогда не будет идентифицировано как дубликат других, вы всегда получаете False, и в выводе ничего не остается, и это причина, по которой вы получили character(0).
Если вы хотите получить "a" в качестве ожидаемого результата, вы можете попробовать
> unique(myvec[duplicated(myvec)])
[1] "a"
Как уже указывали другие ответы, Filter действует отдельно на каждый компонент второго аргумента.
Если второй аргумент представляет собой вектор символов, как в вопросе, то для использования Filter примените его к table(myvec), а не непосредственно к myvec.
myvec |>
table() |>
Filter(f = \(x) x > 1) |>
names()
## [1] "a"
Используемый вход
myvec <- c("a", letters)