Мне было интересно узнать о методах возврата повторяющихся значений в векторе, списке или массиве в 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)