#r #string #list #for-loop #unique
#r #строка #Список #for-цикл #уникальный
Вопрос:
У меня есть список с несколькими строками. Я хотел бы подсчитать количество уникальных строк в каждом элементе списка. Например:
Мой список, называемый test, выглядит следующим образом:
test <- list(
c("X", "Y", "Z", "X"),
c("W", "X", "X"),
c("Z", "W", "Y", "X", "Z", "Z")
)
Я хотел бы получить вывод, который может сказать мне что-то вроде:
[[1]] 3
[[2]] 2
[[3]] 4
Я могу легко подсчитать это для каждого отдельного элемента, используя следующий код:
length(unique(test[[1]]))
Однако я не уверен, как автоматизировать это для большого списка. Я попытался создать цикл for, как показано ниже, но я получаю следующую ошибку:
test_length <- for(i in test){length(unique(test[[i]]))}
Ошибка в тесте [[i]]: нет такого индекса на уровне 1
Комментарии:
1.
sapply(test, function(element) {length(unique(element))})
просто попробуйте это.2. Вы можете использовать цикл for, такой как
test_length <- rep(NA_integer_,length(test)) for(i in 1:length(test)){ test_length[i] <- length(unique(test[[i]])) }
3. Спасибо! Это сработало отлично 🙂
4. Другой сокращенный вариант:
lengths(Map(unique, test))
5. Керри Джексон, ваше предложение выдало следующую ошибку: Ошибка: неожиданное «для» в «test_length <- rep (NA_integer_,длина (тест)) для»
Ответ №1:
Попробуйте использовать lapply
вместо
> lapply(test, function(x) length(unique(x)))
[[1]]
[1] 3
[[2]]
[1] 2
[[3]]
[1] 4
Надеюсь, это поможет!
Ответ №2:
Вот один из вариантов с tidyverse
library(tidyverse)
test %>%
map_int(n_distinct)
#[1] 3 2 4