У меня есть список, который выглядит так (идентификатор — это имя каждого элемента в списке, а баллы — это значения).
Проблема в том, что некоторые элементы содержат повторяющиеся значения. Например: для ID = 8 баллы: 1, 1, 2, 4.
Я хочу иметь возможность подсчитывать, есть ли какие-либо повторы, и сохранять количество повторов. В данном случае: 1х2, 2, 4.
Я пытался:
str_count(patient.variants[[8]], "1")
Но это просто возвращает: 1, 1, 0, 0.
list("1" = c("1", "2", "2"), "2" = c("1", "1", "2", "3"), "3" = c("1", "1", "2", "2"))
Это конфиденциальные данные, поэтому я не могу, и мне пришлось предоставить что-то подобное. @DarrenTsai
Можете ли вы опубликовать свои данные в воспроизводимом формате? Непонятно, в каком формате Scores
, и ваш «список» тоже не похож на типичный R list
. Это не педантизм - нужно дать вам правильное решение.
Если данные конфиденциальны, не могли бы вы опубликовать некоторые фиктивные данные в том же формате, которые выдают ту же ошибку при запуске того же кода?
@AllanCameron Пожалуйста, смотрите редактирование! Это помогает? Спасибо :)
@DarrenTsai Я извиняюсь. Пожалуйста, вы можете увидеть мое редактирование. Я создал список под названием «привет», который представляет то же самое.
Отлично! Пожалуйста, скопируйте/вставьте вывод dput(hey)
в свой вопрос и удалите изображение.
Список @DarrenTsai(1
= c("1", "2", "2"), 2
= c("1", "1", "2", "3"), 3
= c("1", "1", "2", "2"))
Ты можешь попробовать
lapply(lst, \(x) {
tab <- table(x)
unname(ifelse(tab > 1, paste(names(tab), tab, sep = "x"), names(tab)))
})
# $`1`
# [1] "1" "2x2"
#
# $`2`
# [1] "1x2" "2" "3"
#
# $`3`
# [1] "1x2" "2x2"
lst <- list("1" = c("1", "2", "2"),
"2" = c("1", "1", "2", "3"),
"3" = c("1", "1", "2", "2"))
Вариант с tapply
lapply(lst1, \(x) unname(tapply(x, x, FUN = function(x)
if (length(x) > 1) paste(x[1], length(x), sep = "X") else x)))
$`1`
[1] "1" "2X2"
$`2`
[1] "1X2" "2" "3"
$`3`
[1] "1X2" "2X2"
Пожалуйста, предоставьте минимальные воспроизводимые данные или просто скопируйте/вставьте вывод
dput(patient.variants)
.